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