求平均值

二个整型数求其平均值,这个问题有人说,小学生都会. c=(a+b)/2

是的.这是一个很简单的问题.程序员一定也会.可是我们在会的时候,却忘记了会溢出,因为二个整型数相加之后可能会大于int.Max

如果是这样的话,那我们按上面的公式求出来的值还会正确吗.但是我们知道它们的平均值是肯定不会溢出

 

来看一下下面的代码.轻松解决了这个问题.

int average(int x, int y)  //返回X,Y 的平均值
{   
    return (x&y)+((x^y)>>1);
}

不信你可以试一下.看看正确吗

 

原理:求平均数,相同的位,相加再求平均,就相当于该位;不相同的位,相加求平均,就相当于异或后右移一位!

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

对以上代码测试,测试结果如下:
a= 123,b= 234,c= 178
a=-123,b= 234,c=-2147483593
a= 123,b=-234,c= 2147483592
a=-123,b=-234,c=-179
测试结论:
当a,b符号不一致时,其结果不正确
测试人:wooden
测试日期:2008.08.08 14:36
修改方案
int average(int x, int y){ //返回X,Y 的平均值
return (x^y<0)?((x+y)/2):((x&y)+((x^y)>>1));
}
对新方案测试
a= 123,b= 234,c= 178
a=-123,b= 234,c= 55
a= 123,b=-234,c=+55
a=-123,b=-234,c=-179
测试结论:
当a,b符号不一致时,其结果正确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值