位运算总结与应用

一、求下面函数的返回值

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值