按位运算添加

时间:2014-01-13 13:04:46

标签: c++ bit-manipulation bitwise-operators

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

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

2 个答案:

答案 0 :(得分:8)

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

    955
    445
  -----
    390

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

    955
    445
  -----
    101

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

   390
+ 1010
------
  1400

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

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

x ^ y正确添加xy不是1的所有位:

   1110111011
^  0110111101
-------------
   1000000110      (x ^ y)

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

   1110111011
&  0110111101
-------------
   0110111001      (x & y)

当然,当你在添加1时,你将它移到一个地方,就像你在基地10中添加一样。

   1000000110      (x ^ y)
+ 01101110010    + (x & y) << 1
-------------
  10101111000

答案 1 :(得分:2)

x + y不等同于x ^ y + (x & y) << 1

但是,对于大多数值,上面的表达式将评估为true,因为=表示赋值,非零值表示true。 ==将测试是否平等。

修改
括号中x ^ y + ((x & y) << 1)是正确的。 AND发现进位将发生的位置,并且变换带有它。 XOR找到没有进位的地方和附加。将两者相加可以统一结果。