x+y = ((x&y)<<1) + (x^y) 证明

法一:
我们考虑x,y在二进制表示时候,按位相加
其中第i位
xi+yi = ((xi&yi)<<1) + (xi^yi)
其中(xi&yi)<<1表示当xi和yi都是1是,需要进位1.
     xi^yi表示不考虑进位,当前位的值.
把所有这些数据相加,也就是
x+y = Sum{xi*2^i}+Sum{yi*2^i} = Sum{(xi+yi)*2^i} 
     = Sum{ (((xi&yi)<<1)+(xi^yi))*2^i }
     =Sum{ ((xi&yi)*2)*2^i + (xi^yi)*2^i}
     =Sum{(xi&yi)*2^i}*2 + Sum{(xi^yi)*2^i}
     =(x&y)*2+(x^y)
     =((x&y)<<1)+(x^y)

法二:

x = (x&y) + ((x^y)&x)
y = (x&y) + ((x^y)&y)
((x^y)&x) + ((x^y)&y) = x^y 
----------------------------------
x + y = 2 * (x&y) + (x^y)

应用:

利用位运算实现两个整数的加法运算

int Add(int a,int b)
{
  if(b == 0) return a;
  int sun,carry;
  sum = a^b; //完成第1步无进位加法
  caryy = (a&b)<<1; //完成第2步有进位的加法,并进位
  return Add(sum,carry); //进行递归相加
}
时间: 2024-08-09 22:01:57

x+y = ((x&y)<<1) + (x^y) 证明的相关文章

linux hdparm&#39;s -y 和 -Y 的区别

-y Force an IDE drive to immediately enter the low power consumption standby mode, usually causing it to spin down. The current power mode status can be checked using the -C flag. -Y Force an IDE drive to immediately enter the lowest power consumptio

原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y

简介 关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种: event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.screenX/Y clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距离,会随着页面滚动而改变 兼容性:除IE6/7/8不支持外,其余浏览器均支持

clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y 详解

clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距离,会随着页面滚动而改变 兼容性:除IE6/7/8不支持外,其余浏览器均支持 offsetX/Y: offsetX/Y获取到是触发点相对被触发dom的左上角距离,不过左上角基准点在不同浏览器中有区别,其中在IE中以内容区左上角为基准点不包括边框,如果触发点在边框上会返回负值,而chrome中以边框左

clientX/Y pageX/Y offsetX/Y layerX/Y screenX/Y

关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种 event.clientX/Y event.pageX/Y event.offsetX/Y event.layerX/Y event.screenX/Y clientX/Y: clientX/Y获取到的是触发点相对浏览器可视区域左上角距离,不随页面滚动而改变 兼容性:所有浏览器均支持 pageX/Y: pageX/Y获取到的是触发点相对文档区域左上角距离,会随着页面滚动而改变 兼容性:除IE6/7/8不支持外,其余浏览器均支持 off

[译] The Why of Y - 理解Y Combinator

原文:(The Why of Y) 作者: Richard P. Gabriel Lucid, Inc. and StanfordUniversity 你是否好奇Y(Y combinator,下文简称Y)的工作原理.前人是怎么发明出这玩意的?我将在这篇文章中告诉你.我将使用Scheme语言描述,因为用这种语言表达"作为参数传入另一个函数的函数被调用"更容易理解. Y存在的意义是,在不使用(某种语言提供的)特殊的内置方法的情况下写出自引用的(self-referential)(译注:也就

(x&amp;y) + ((x^y)&gt;&gt;1)即x和y的算数平均值

(x&y) + ((x^y)>>1)相当于(x+y)/2 (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还是原来的数,如两个000

JavaScript定义数组的三种方式(new Array(),new Array(&#39;x&#39;,&#39;y&#39;),[&#39;x&#39;,&#39;y&#39;])

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

x^y=(x&amp;~y)|(~x&amp;y)证明

我见过最棒的证明是文氏图:(首先要知道二元布尔代数是集合的特殊情况,所以把X和Y当作两个集合,结论成立,那么在二元布尔代数里面也成立.)左边的圈是X,右边的圈是Y.如果是OR 也就是取或,中间的白色的也要填成红色的.但是,异或 的英文名字叫做exclusive-or ,意思是除掉了(中间部分)的or. 接下来就是玩拼图游戏啦: X | Y: x&Y: X-:X- & Y:详见: http://www.zhihu.com/question/20224242

Solve Equation gcd(x,y)=gcd(x+y,lcm(x,y)) gcd(x,y)=1 =&gt; gcd(x*y,x+y)=1

/** 题目:Solve Equation 链接:http://acm.hnust.edu.cn/JudgeOnline/problem.php?id=1643 //最终来源neu oj 2014新生选拔赛题 题意:给定两个数的和以及他们的最小公倍数,求这两个数. 思路: x+y=A lcm(x,y)=B => x*y/gcd(x,y)=B 要把这两个公式联立,那么必须消掉gcd: 设:d = gcd(x,y), x = kx*d, y = ky*d; kx与ky互质: x+y=A => d(