1. 程式人生 > >巧用&符號,判斷一個數的奇偶性,判斷一個數(x)是否是2的n次方

巧用&符號,判斷一個數的奇偶性,判斷一個數(x)是否是2的n次方

判斷一個數的奇偶性,是在C++ PRIMER習題集看見的,感覺有意思:

假設有一個整數x哈,假設

那麼就有:

if(x&1)
    cout<<"奇數"<<endl;
else
   cout<<"偶數"<<endl;

以八位二進位制為例:1的二進位制為00000001那麼一個奇數的二進位制最後一位一定為1,那麼一個奇數和1想與一定為1,反之,偶數的二進位制的最後一位一定為0,所以,一個偶數和一個1想與一定為0;

求下面函式的返回值(微軟) ---------統計1的個數
int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;

假定x = 9999
10011100001111
答案: 8
思路: 將x轉化為2進位制,看含有的1的個數。

注: 每執行一次x = x&(x-1),會將x用二進位制表示時最右邊的一個1變為0,因為x-1將會將該位(x用二進位制表示時最右邊的那個1)變為0。(假設該位為第k位,減1後,該位後面全部變成1,但是由於該位是最右邊的1了,所以x的第k位後面全是0,而x-1的第k位是0,從1到k-1位全是1,按位與的結果自然就是第k位和1~k-1位都變成0。)
所以該表示式的用途之一:

1:將最低的為1的位變成0,這個解釋理解起來不難。

該表示式的第二個用途為:
2:當x為奇數的時候,x=x&(x-1)它的值相當於x=x-1;一樣的效果;當x為2的N次冪時,結果為0,這可以用來快速判斷一個數是否為2的n次方。

判斷一個數(x)是否是2的n次方
#include <stdio.h>
int func(int x)
{
if( (x&(x-1)) == 0 )
return 1;
else
return 0;
}

int main()
{
int x = 8;
printf("%d\n", func(x));
}
注: 
(1) 如果一個數是
2的n次方,那麼這個數用二進位制表示時其最高位為1,其餘位為0,然後利用上面的思路就很容易想通了。