判斷一個數是否爲2的N次方問題

對於判斷一個數是否爲2的N次方問題,通常想到的最爲直接的辦法就是對這個數不斷對2取餘,爲0就將該數變爲該數除以2,直到最後該數爲1爲止。

void judge(int n)  
{  
    while(!(n % 2))  
    {  
         n = n / 2;  

         if(n == 1)  
         {   
              printf("yes!\n);  
              return;  
         }  
    }  

     printf("NO!\n");  
     return;  
}  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

不過上面的方法並不是較好的方法,其實還有更爲簡潔高效的方法 
一個整數,若是2的n次方,有沒有想過對這個整數的2進制進行考慮,比如12,它的二進制爲:1100

2 10 
4 100 
13 1101 
16 10000 
32 100000 
從上面的舉例我們發現,凡是2的N次方的整數,其二進制碼只有一個1。 
假設A爲要證明的整數,B等於A-1,我們假設A爲2的N次方數,那麼A&B = 0,這很好證明。那是不是滿足A&B = 0就能證明A是2的N次方數呢? 
假設一個數的二進制爲1000000000000000(這裏爲int型:兩個字節),那這個數減去1則變爲0111111111111111。我們知道,在計算機中,數都是以其二進制的補碼放置的,最高位爲1代表負數,最高位爲0代表正數。上面兩個數中, 
1000000000000000爲負數,0111111111111111爲正數,這兩個數相與爲0,但1000000000000000並不是2的N次方(2的N次方爲正數)。 
因此,倘若一個數爲2的N次方,那麼該數應滿足大於0且該數和該數減一後的值相與等於0時才爲2的N次方。

void judge(int n)  
{  
    if((n > 0) && (n & (n -1) ==0))  
   {  
        printf("Yes!\n");  
        return;  
   }  

   printf("NO!\n");  
   return;  
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章