一、求下面函數的返回值
int func(x)
{
int count = 0;
while(x)
{
count++;
x = x&(x-1);
}
return count;
}
功能:將x轉化爲2進制,看含有的1的個數。
每執行一次x = x&(x-1),會將x用二進制表示時最右邊的一個1變爲0,因爲x-1將會將該位(x用二進制表示時最右邊的一個1)變爲0。
二、下面函數的作用
bool func(int x)
{
if( (x&(x-1)) == 0 )
return true;
else
return false;
}
功能:判斷一個數是否2的N次方。
如果一個數是2的n次方,那麼這個數用二進制表示時其最高位爲1,其餘位爲0,減去1和原來的數進行位與運算,得到的結果可以作爲判斷依據。
這裏== 優先級高於 &,所以以上代碼可以優化:
bool func(int x)
{
return !(x&(x-1));
}
三、求下列函數的調用結果
int func(int x, int y) {
return ( (x&y) + ((x^y) >> 1) );
}
int main()
{
cout << func(729, 271);
}
功能:計算兩個數的平均值。
按位與是相同位和的一半,按位或是不同位的和,右移相當於除以2,所以該函數相當於求兩個數之和的一半。
所以,輸出500;
所以要通過位運算來實現兩個數之和,可以這樣做:
int add(int a, int b)
{
if (0 == b)
return a;
int sum, carry; //和和進位
sum = a^b; //兩個數的沒有進位的和
carry = (a&b) << 1;
return add(sum, carry); //遞歸調用
}