int f(int x,int y) {return (x&y) + ((x^y)>>1);} 的结果为?

int f(int x,int y) 
{
    return (x&y) + ((x^y)>>1);
}

采用笨方法的话就是把  x和y 都转为二进制,然后逐个逐个的算出来。

也可以用第二种方法算出来,其实 (x&y) + ((x^y)>>1) 就是求  x和y 的平均值的意思。

证明一下 (x&y) + ((x^y)>>1)为什么是求平均值。

在二进制中,两个数之间对应的位置都可以进行  按位与 & 、按位或 | 、按位异或 ^ 运算。

把 x和y 里对应的每一位都分成三种,每一种分别计算平均值,最后汇总。

假设 x = 22, y = 29, (22+29)/ 2 = 25;  25的二进制为:11001.

第一种 :如果x和y对应位上全为1 ,就用 x&y 来计算x和y平均值。

第二种:如果x和y对应位上只有一个1,就用 x^y 来计算平均值。

第三种:如果对应位置上都是0,什么都不用做。

最后把第一种的平均值和第二种的平均值加起来:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值