按位运算添加

Ole*_*tov 4 c++ bit-manipulation bitwise-operators

你能帮我弄清楚下面的表达式为什么是真的:x + y = x ^ y +(x&y)<< 1

我正在寻找一些来自按位逻辑的规则来解释这个数学等价物.

Pau*_*aul 8

这就像解决一个普通的基础10添加问题955 + 445,首先单独添加所有列并丢弃携带1的:

    955
    445
  -----
    390
Run Code Online (Sandbox Code Playgroud)

然后查找应该携带的所有列1:

    955
    445
  -----
    101
Run Code Online (Sandbox Code Playgroud)

将其移动并将其添加到原始结果中:

   390
+ 1010
------
  1400
Run Code Online (Sandbox Code Playgroud)

所以基本上你是在做加法但忽略了所有进行1的,然后加入后面的,作为一个单独的步骤.

在基数2中,^当任一位为a时,XOR()正确地执行加法0.当两个位都是时1,它执行加法而不进位,就像我们在上面的第一步中所做的那样.

x ^ y正确地将所有位添加到何处x并且y不是两者1:

   1110111011
^  0110111101
-------------
   1000000110      (x ^ y)
Run Code Online (Sandbox Code Playgroud)

x & y给出了1所有列中两个位都是1的列.这些正是我们错过了一个进位的列:

   1110111011
&  0110111101
-------------
   0110111001      (x & y)
Run Code Online (Sandbox Code Playgroud)

当然,当你进行1添加时,你将它移到一个地方,就像你添加10基地一样.

   1000000110      (x ^ y)
+ 01101110010    + (x & y) << 1
-------------
  10101111000
Run Code Online (Sandbox Code Playgroud)