c語言==判斷一個數是否為2的整數次方【不使用迴圈】
阿新 • • 發佈:2019-01-30
對於判斷一個數是否為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;
}