计算两个数的平均数的几种方法解读

来源:互联网 发布:linux开机启动shell 编辑:程序博客网 时间:2024/06/05 10:01

求平均值的方法有很多,假设有两个整型数,在下边用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



原创粉丝点击