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

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



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值