一、求下面函数的返回值
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); //递归调用
}