1. 程式人生 > >c語言==判斷一個數是否為2的整數次方【不使用迴圈】

c語言==判斷一個數是否為2的整數次方【不使用迴圈】

對於判斷一個數是否為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;  
}  

不過上面的方法並不是較好的方法,其實還有更為簡潔高效的方法 
一個整數,若是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;  
}