求平均数的简单方法

本文探讨了如何利用位运算求解平均数,这种方法能够有效地避免整数溢出问题。通过x&y计算相同位的一半,x^y求解不同位,再进行右移操作,可以巧妙地得到平均数的结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

平均数是表示一组数据集中趋势的量数,它是反映数据集中趋势的一项指标。


生活中我们经常使用 平均成绩、平均身高、平均速度这样的平均数来比较不同组数据之间的差距,虽然平均数使用了所有数据值信息,但是如果有 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);
}


我们的重点在于研究如何求平均数,(x+y)/2 可以,(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










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值