求平均值的方法有很多,假设有两个整型数,在下边用a,b解释
1.大家都能想起来的方法是直接求平均值
int average(int a, int b)
{
return (a + b) / 2;
}
但是存在溢出的现象,我们就要考虑使用其他方法来避免这种现象的发生
2.
int average(int a, int b)
{
return a + (b - a) / 2;
}
这种方法看起来是不是会好一些点呢?其实还可以用位运算来求平均值
3.将2中的方法改进一下
int average(int a, int b)
{
return a + ((b - a) >> 1);
}
右移一位就相当于除二
解释一下:
5的二进制可以写为: 00000101
右移一位的二进制为:00000010 //2
这样就可以求出一个数的平均值了
4.从3中可以得到启示,我们首先要清楚与(&)和异或(^)是怎么运算的
按位与:
0&0=0 0&1=0
1&0=0 1&1=1
异或:
0^0=0 0^1=1
1^0=1 1^1=0
现在我们就用位运算来实现求平均值
int average(int a, int b)
{
return (a&b) + ((a^b) >> 1);
}
分析:
a&b 相同位按位与还是本身,不同位按位与是0
(a^b)>>1 不同的二进制位加起来除以二
举个例子:
a=5,b=4
a 000101 //5
b 000100 //4
a&b 000100 //4
a^b 000001 //1
求得:(a&b)+((a^b)>>1)=4+1/2=4