使用位运算实现取平均数
实例代码
#include <cstdio>
using namespace std;
int func(int x,int );
int main()
{
printf("result=%d",func(729,271));
return 0;
}
int func(int x,int y){
return (x&y)+((x^y)>>1);
}
输出结果:
可以看到这里的结果就是,两个数的平均数
结果分析:
这个函数可以分为两个部分
一是x&y
这里是按位与,可以理解为相同则保持原状,不同则为0.
很明显这里保存了X和Y相同位置的和的一半。
二是x^y
这里是按位异或,可以相同则为0,不同则为1.
好了,这里也很明显,是不同位的和,注意这里不是一半。
三是(x^y)>>1
右移一位,代表值为原来的一半。
四是(x&y)+((x^y)>>1)
者代表了相同位和的一半加上不同位置的和的一半,结果就是原来的两个数的和的一半,就是二者的平均数。