位运算总结与应用

一、求下面函数的返回值

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); //递归调用
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章