位運算中 x&(-x) 的意義是:
把x的二進制表示中,除了最右邊的一個“1”留下,其他全部變成0後的十進制表達。
例如: 10&(-10)=?
10的二進制表示的後4位為:1010,
-10的二進制表示的後4位為:0110;
由於10的二進制表示中除了後四位以外均為0,-10的二進制表示中除了後四位以外都是1,所以這些數取“與”運算的結果都是0,不予考慮。
所以:1010與0110取“與”運算的結果就是:
0010,即2。
應用:
11&(-11)=1 => 11(base 10)=1011(base 2) => 0001 =>1
12&(-12)=4 => 12(base 10)=1100(base 2) => 0100 =>4
2011年10月26日 星期三
位運算中 x&(x-1)表達式的意義
請看下面的函數:
int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
假定x = 9999
則返回多少?
答案: 8
解析:9999的二進制的表示為10011100001111,看它的二進制表示中有幾個1。
其實這個函數的意義是統計X的二進制表示中1的個數。
注: 每執行一次x = x&(x-1),會將x用二進制表示時最右邊的一個1變爲0,因爲x-1將會將該位(x用二進制表示時最右邊的一個1)變爲0。
int func(int x)
{
if( (x&(x-1)) == 0 )
return 1;
else
return 0;
}
int main()
{
int x = 8;
printf("%d\n", func(x));
}
int func(int x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
假定x = 9999
則返回多少?
答案: 8
解析:9999的二進制的表示為10011100001111,看它的二進制表示中有幾個1。
其實這個函數的意義是統計X的二進制表示中1的個數。
注: 每執行一次x = x&(x-1),會將x用二進制表示時最右邊的一個1變爲0,因爲x-1將會將該位(x用二進制表示時最右邊的一個1)變爲0。
【應用】
判斷一個數(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。
(2) == 優先級高於 &
訂閱:
文章 (Atom)