答案说这段的功能就是计算x和y的平均值 但我不太懂。。。
追答知道答案再来证明就有方向了,呵呵,
首先,按位与和按位异或都可以转为四则运算,对于每一位来说:
x and y = x * y
x xor y = (x-y) * (x-y)
这里x与y的取值都是0或者1 (不要问我为什么这2个等式成立,x和y的取值组合就4种,可以组合来试试看是否2边都相等)
然后任何一个整数X,我们假设是32位整数(实际上多少位整数都一样的),可以写成 x1*2^31+x2*2^30+x3*2^29+...+x32, 这里 x1,x2到x32的取值都是0或者1,2^n表示2的n次方
另外对整数的按位的与运算可以转化为四则运算,写成
x and y = x1*y1*2^31 + x2*y2*2^30 + ... + x32*y32
x xor y = (x1-y1)*(x1-y1)*2^31 + ... + (x32-y32)*(x32-y32) = (x1*x1 - 2*x1*y1 + y1*y1)*2^31 + ... + (x32*x32 - 2*x32*y32 + y32*y32)
注意到因为x1到x32取值都是0或者1,所以x1*x1=x1,x2*x2=x2...,x32*x32=x32,对于y1到y32同理
那么x xor y = (x1 - 2*x1*y1 + y1)*2^31 + ... + (x32 - 2*x32*y32 + y32)
现在就是要证明给定2个整数x,y,(x and y) + (x xor y) >> 1 = (x + y)/2,我们知道 (x xor y) >> 1实际上就是 (x xor y) / 2,所以把两边等式都*2,变成要证明 2*(x and y) + (x xor y) = x+y
通过上面的公式,我们可以知道
2*(x and y) + (x xor y) =
2*(x1*y1*2^31 + x2*y2*2^30 + ... + x32*y32) + ((x1 - 2*x1*y1 + y1)*2^31 + ... + (x32 - 2*x32*y32 + y32)) =
(2*(x1*y1)+(x1 - 2*x1*y1 + y1))*2^31 + ... + (2*x32*y32 + x32-2*x32*y32+y32) =
(x1+y1)*2^31+(x2+y2)*2^30+...(x32+y32)=
x1*2^31+x2*2^30+...+x32 + y1*2^31+y2*2^30+...+y32=
x+y
证明完毕
位运算作用,求个真的懂这个的来
int f(int x,int y){ return (x&y)+((x^y)>>1);};f(729,271)=500.解答:x&y是取相同的位与,这个结果是x和y相同位,x^y是取x和y的不同位的和,右移1位,相当于除以2.所以结果是求x和y的平均数。如果二进制不易理解,那我们看看十进制的情况。假如将&操作和^操作推广到是取...
两个二进制数的异或结果是多少?
int f( int x, int y ){ return ( x&y )+( ( x^y )>>1 )} 问:f(729,271)=??本题可以按照所谓的“笨方法”来做。按照上面的分析,我们知道x^y是729和271不同位的和,右移一位,就是除2。而x&y呢?你可以按照我刚分析的x^y就可以知道x&y是取x和y相同位的和的一半。所以...
如何解释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,无须计算。下面我再分别说明一...
fun(int x,int y,int z){z=x*x+y*y;}main(){int a=31;fun(5,2,a);p...
也可以通过指针所指来修改地址值 也就是 void fun (int ,int int * )
c语言fun(int x,int y)
如 int fun(int x,int y) \/\/即fun函数是个执行两个int型数据加法运算的动作 { return x+y;} void main(){ cout<<fun(1,19)<<endl;\/\/用1和19这两个int型的数据来执行这个fun的加法运算 }
int func(int x,int y ) { return(x+y) } main() {int a=1, b=2...
(a+b,b+c,c+a) \/\/c+a,逗号从左往右,是4 d+e是9 9+4=13;输出:13
int max(int x, int y) { return( x>y ? x : y ); } 这句函数是啥意思...
int max(int x, int y) { return( x>y ? x : y );} 相当于 int max(int x, int y){ if(x>y){ return x;} else { return y;} } ?: 运算符 与if else功能基本相同 满足条件执行?后:前的 不满足则执行:后的
...int fun (int x,int y) { if (x!=y) return ((x+y);2); e_百度知...
根据你给的信息,我发现你这个程序有好多问题,多的不好说,于是我据你的意思自己写了一下这个程序,如下:include<stdio.h> int main(){ int fun(int x,int y);int a=4,b=5,c=6;printf("%d\\n",fun(2*a,fun(b,c)));return 0;} int fun(int x,int y){ if(x!=y) return(...
...fun(int x, int y) {int z; z=x>y?x:y; return(x+z); } main...
a-b=5,b+c=4 fun(5,4)即x=5,y=4,执行fun函数 由z=x>y?x:y 得z=5,return(x+z);得最后的值为5+5=10 还不懂的话就加我的QQ602356234
函数max2(int x,int y){ return (x>y)?x:y; } max3(int x,int y,int...
A) return max2(x,y)>z? max2(x,y):z;如果xy中的较大值,比z大,那么返回xy中的较大值, 否则返回z。B) return max2(max2(x,y),z);先找到xy中较大值,然后和z比较,返回其中最大值。C) return (x>y?max2(x,z):max2(y,z));先判断x和y的大小关系, 如果x比较大,那么...