二个整型数求其平均值,这个问题有人说,小学生都会. 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符号不一致时,其结果正确