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,什么都不用做。
最后把第一种的平均值和第二种的平均值加起来: