[QUIZZ] Calculer la plus petite puissance de 2 superieure a un entier

Calculer la plus petite puissance de 2 superieure a un entier [QUIZZ] - C++ - Programmation

Marsh Posté le 09-06-2004 à 03:17:21    

Un petit quizz pour ceux que ca amuse :
 
Le but est de trouver pour n'importe quel entier la puissance de 2 superieure la plus proche de sorte que :
 
888 -> 1024
512 -> 512
33 -> 64


Message édité par cnstrnd le 09-06-2004 à 03:19:36
Reply

Marsh Posté le 09-06-2004 à 03:17:21   

Reply

Marsh Posté le 09-06-2004 à 05:24:13    

edit : merde on est en c++..


Message édité par LeGreg le 09-06-2004 à 05:27:59
Reply

Marsh Posté le 09-06-2004 à 09:29:08    

Une petite bidouille en binaire et ça doit être réglé.
Mais je sais pas si c'est ce que tu cherches ou un algo un peu plus accadémique. Un truc du genre

Code :
  1. unsigned long int num = 888;
  2.     unsigned long int mask = 1 << 31;
  3.     while ( mask > num )
  4.     {
  5.         mask >>= 1;
  6.     }
  7.     mask <<= 1;
  8.     std::cout << "puissance la plus proche de " << num << " = " << mask << "\n";



---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 09-06-2004 à 09:36:46    

Code :
  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. unsigned long nb;
  6. cin >> nb;
  7. unsigned long res=2;
  8. while(res<nb)
  9.  res<<=1;
  10. cout << res << '\n';
  11. }


 
sinon, en essayant de déplier les résultats possibles (32 bits sur un unsigned long, c'est pas énorme)
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. template<unsigned long res>
  4. inline void test(unsigned long nb)
  5. {
  6. if(res<nb)
  7. {
  8.  test< res<<1 >(nb);
  9. }
  10. else
  11. {
  12.  cout << res << '\n';
  13. }
  14. }
  15. int main()
  16. {
  17. unsigned long nb;
  18. cin >> nb;
  19. test<2>(nb);
  20. }


 
qqun pourrait me dire si ma méthode est juste ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 09-06-2004 à 10:13:55    

avec l'assembleur c'est encore meilleur !
 

Code :
  1. unsigned int smallestGreaterOrEqualPowerOfTwo(unsigned int num)
  2. {
  3.     if !(num & (num-1)) return num;
  4.     __asm
  5.     {
  6.         bsr   eax,   num
  7.         mov   num,   eax
  8.     }
  9.     return (1 << num);
  10. }


 
attention le cas ou num est déjà une puissance de 2 est un cas à part !


Message édité par jesus_christ le 04-05-2005 à 22:05:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed