如何解释C++里(x&y)+((x^y)>>1)的功能是取两个数的平均值?

如题所述

(x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。其中,一类是x,y对应位都是1,用x&y计算其平均值;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;还有一另是x,y中对应位均为0,无须计算。

下面我再分别说明一下前两种情况是怎样计算的:
1)、x,y对应位均为1,相加后再除以2还是原来的数,如两个00001111相加后除以2仍得00001111,这是第一部分。
第二部分,对应位有且只有一位为1,用“异或”运算提取出来,然后>>1(右移一位,相当于除以2),即到到第二部分的平均值。
第三部分,对应位均为零,因为相加后再除以二还是0,所以不用计算。
三部分汇总之后就是(x&y)+((x^y)>>1)

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-02-13
很牛X的一个思路,虽然不算高效,但如果在汇编中的话,这种方法可以不产生高位溢出。
我琢磨了一下,大概思路应该是这样:

(x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。其中,一类是x,y对应位都是1,用x&y计算其平均值;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;还有一另是x,y中对应位均为0,无须计算。

下面我再分别说明一下前两种情况是怎样计算的:

x,y对应位均为1,相加后再除以2还是原来的数,如两个00001111相加后除以2仍得00001111,这是第一部分。
第二部分,对应位有且只有一位为1,用“异或”运算提取出来,然后>>1(右移一位,相当于除以2),即到到第二部分的平均值。
第三部分,对应位均为零,因为相加后再除以二还是0,所以不用计算。
三部分汇总之后就是(x&y)+((x^y)>>1)

顺便解释一下前面说到可以避免溢出。
假设x,y均为unsigned char型数据(0~255,占用一字节),显然,x,y的平均数也在0~255之间,但如果直接x+y可能会使结果大于255,这就产生溢出,虽然最终结果在255之内,但过程中需要额外处理溢出的那一位,在汇编中就需要考虑这种高位溢出的情况,如果(x&y)+((x^y)>>1)计算则不会。

如何解释C++里(x&y)+((x^y)>>1)的功能是取两个数的平均值?
(x&y)+((x^y)>>1),把x和y里对应的每一位(指二进制位)都分成三类,每一类分别计算平均值,最后汇总。其中,一类是x,y对应位都是1,用x&y计算其平均值;一类是x,y中对应位有且只有一位是1,用(x^y)>>1计算其平均值;还有一另是x,y中对应位均为0,无须计算。下面我再分别说明一...

C++:为什么算平均数还可以用以下算法呢?这个是什么原理呢?
^按位异或 若参加运算的两个二进制位值相同则为0,否则为1。对应位不同可以确定其中一个是1另一个是0 二者相加还是1。所以,x^y得出了x和y所有不同位相加的结果。(x^y)>>1右移动1位相当于除2,再加上相同的部分即x&y就得出了均值。

c++ for的循环语法 输入两个整数X和Y,输出两者之间的素数个数(包括X和...
第8行少了个判定吧,if(x > y),不然不管你xy两个值为多少都做交换

怎么用C语言算任意两个数平均值
修改后如下,主要问题为,a=sum\/2.0,若除以2,则最后结果为一个整型 include <stdio.h>void main(){ int x,y ;printf("plesae in put two numbers");scanf("%d%d",&x&y");float a,sum;sum=x+y;a=sum\/2.0;printf("The average is :%f ",a);} ...

(x^y)C++里边,啥意思?
意思是 X和Y的按位异或,将X和Y按位表示,比如X=3,Y=5; 假如X和Y的数据长度是一个字节,那X按位就表示为:0000 0011,Y就表示为:0000 0101;那么对应位异或下来结果就是 0000 0110,也就是说X和Y的对应位要是不相同,结果的对应位就为1,相同则为0....

C++中为什么if(x‖y)i++可使i变成1
||是一个运算符。x || y这样的表达式当然可以作为条件

C++问题 交换两个数的值
x,y的是定义在函数内部的变量,只能在函数内部使用,函数结束后,x,y就不存在了。你在写函数的时候,完成了x,y的交换,但是并没有通过返回函数或指针把结果会写到i1,i2.和d1,d2。如果你不理解为什么i1和x,i2和y对应的不是同一个东西的话,请阅读C语言教程里关于函数的形参和实参的相关...

如何在c++定义一个学生类以实现平均成绩的计算和查询功能?
笔者在交流中发现,不同的人对中间件的理解并不一样,甚至可以说,到现在,这个概念还是模糊不清的。比如:(1)有的人认为中间件仅指位于OS内核之上、功能软件之下的那部分组件,为上层提供进程管理、升级管理等服务;而有的人则认为中间件还应包括功能软件和应用软件中间的那部分(参见上图)。按茅海燕的说法,前者是“...

c++定义学生类实现平均成绩计算和查询功能?
}假设输入的n和m都是正整数,x和y都是在[1,n]的范围内的整数,完成下面的判断题和单选题判断题1)当m>0时,输出的值一定小于2n。()答案:√试题分析:按照题意,a数组和b数组赋值为0,a[x] < y && b[y] < x成立,累计计算求和,最终结果肯定小于2n。

if(x&y){}什么意思?请高手指点
&是表示逻辑且的关系 只有当x 和y表达式都是真的时候才是真 &&也表示且 &与&&是&:x、y都要计算 &&:只要能确定结果后面的就不计算了...

相似回答