天天看點

x&(x-1)的含義

求下面函數的傳回值(微軟) ———統計1的個數

int func(int x)
{
int countx = ;
while(x)
{
countx++;
x = x&(x-);
}
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-)) ==  )
return ;
else
return ;
}

int main()
{
int x = ;
printf("%d\n", func(x));
}