文章目录
二个整型数求其平均值,这个问题有人说,小学生都会. c=(a+b)/2
是的.这是一个很简单的问题.程序员一定也会.可是我们在会的时候,却忘记了会溢出,因为二个整型数相加之后可能会大于int.Max
如果是这样的话,那我们按上面的公式求出来的值还会正确吗.但是我们知道它们的平均值是肯定不会溢出
来看一下下面的代码.轻松解决了这个问题.
int average(int x, int y) //返回X,Y 的平均值
{
return (x&y)+((x^y)>>1);
}
不信你可以试一下.看看正确吗
----------------------------
评论
return (x/2 + y/2);
或
return ( (x>>1) + (y>>1) );
这样也不会溢出,而且可读性高。
由于X,Y取的是整型,如果取奇数,X/2 数据就会丢失,如:当X=3,Y=3,X/2=1而不会等于1.5,Y/2=1也不会等于1.5,这样平均值就等于2了。
为了避免数据丢失,我门应该把X,Y的数据类型变成 double类型。
问下你这种求平均值的方法数学依据是什么?
问下你这种求平均值的方法数学依据是什么?
问下你这种求平均值的方法数学依据是什么?
但是怎么删?
{
return (x/2+y/2+(x%2+y%2)/2);
}
求平均数,相同的位,相加再求平均,就相当于该位;不相同的位,相加求平均,就相当于异或后左移一位!
高,实在是高!
不过楼上解释的够清晰
我开始还没有看明白呢
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符号不一致时,其结果正确
a + ( b - a ) / 2
虽然和主题有一点点矛盾
return (x^y<0)?((x+y)/2):((x&y)+((x^y)>>1));
这里(x+y)/2 就是楼主所说的溢出,但是这里很聪明
是当其符号不一致时采用的相加模式,因而不会溢出
只是忽略了一点奇数问题 能给个更完善的解决方法么?
呵呵
temp = y + (x-y)/2;
else
temp = x + (y-x)/2;
这样可读性比较强点吧
(x>>1)+(y>>1)+(x&1&y)+(((x&1)^(y&1))&(((x>>31&1)&(~x&1))^((y>>31&1)&(~y&1))));
严重支持
#include <iostream>
using namespace std;
int average(int x, int y) //·µ»ØX,Y µÄƽ¾ùÖµ
{
return (x&y)+((x^y)>>1);
}
int main()
{
cout<<average(123,-234);
getchar();
return 0;
}
结果是 -56
不知道wooden是用什么怎么测试的。。
更容易理解,那个">>",我还没学到,看不懂呢。