算法-算法:哎哟喂,这是在用二进制求平均数吗?来个大哥给指点一下吧

发布于 2017-06-03 14:31:23 字数 169 浏览 1174 评论 1

int getAverage(int x, int y){
return ((x ^ y) >> 1) + (x & y);
/*(x^y) >> 1得到x,y其中一个为1的位并除以2,x&y得到x,y都为1的部分,加一起就是平均数了*/
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想挽留 2017-08-09 15:33:36

其实你的问题,上面的说明已经解释了。
x、y对应位都是1,相加后再除以2还是原来的数,如两个00001111相加后除以2仍得00001111,这是第一部分。
x、y对应位有且只有一位为1,用“异或”运算提取出来,然后>>1(右移一位,相当于除以2),即到到第二部分的平均值。

比如说 a是 0000 0110 b是 0000 0100
那么他们的平均值分为三个部分,
第一部分是 两个数都是为1的位,这一位就是第 3位,在这部分中,他们的平均值是1。即 0000 0100
第二部分是 两个数有且只有一个为1 的位,符合这个要求的只有第二位,因此在这部分中,他们的平均值为 0000 0001
第三部分 为 两个数都是0的位,这部分的平局值 为 00000000

a 和b的平均值为这三部分的平均值之和 即 0000 0101。

其实这样做的原理是 把 a 和 b都分成3段, a=0000 0000 + 0000 0100 + 0000 0010
b=0000 0000+ 0000 0100 +0000 0000
求a 和b 的平均值,就是分别求这三段的平均值,然后把它们的平均值相加。 而每一部分的平均值正是如上所说的求法

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文