概述
平均数是表示一组数据集中趋势的量数,它是反映数据集中趋势的一项指标。
生活中我们经常使用 平均成绩、平均身高、平均速度这样的平均数来比较不同组数据之间的差距,虽然平均数使用了所有数据值信息,但是如果有 0,1,99这样的极端数据在成绩表中,那么平均成绩必定是偏向更大一方或更小一方。在一个班级中少有的几个99分的成绩很容易让人高估了这个班的整体水平,所以往往我们还要参考众数、中位数这样的指标来综合评定,不过说了这么多,评定指标和现在的我们没多大关系,我们接下来只是单纯地讨论如何求平均数。
接下来是正文:
int average(int x,int y)
{
return (x+y)/2;
}
int average(int x,int y)
{
return (x&y)+((x^y)>>1);
}
而且而且不需要担心int溢出问题,这不科学!
回归本心,我们先来看看传统做法(炒菜么 ? o_O )
n=2
两数之和除以2,求之平均数,若两数无穷无尽(无穷大),穷其一生也毫无进展。
很明显 用位运算可以很好地装13,不,避免溢出
x&y求出 二者的相同位,x-x&y得出的是二者 x 和 相同位 不同的位,即x与x&y的不同点(有几个1)
好吧,我还是说人话吧
( x&y ) + ( ( x^y )>>1 )
x&y 计算 二者二进制位相同的部分的一半,x^y计算二者二进制上不同的部分,右移一位除以二
1&1 = 1 本来1+1=2,需要进位,这里没有进,结果还是1(而不是2),想想看,本来 1+1=2,结果却=1是不是变成了1/2
1^0 还是0^1 都一样
1^0=1 1>>1 你说等于多少呢? 嗯,1/2