请你帮我弄清楚以下表达式为什么是真的: x + y = x ^ y +(x& y)<< 1
我正在寻找一些来自按位逻辑的规则来解释这个数学等价物。
答案 0 :(得分:8)
这就像解决普通的基数10加法问题955 + 445
一样,首先单独添加所有列并丢弃携带的1
:
955
445
-----
390
然后查找应该携带1
的所有列:
955
445
-----
101
将其移动并将其添加到原始结果中:
390
+ 1010
------
1400
所以基本上你是在做加法但却忽略了所有携带的1
,然后在后面加入后面的,作为一个单独的步骤。
在基数2中,当任一位为^
时,XOR(0
)正确执行加法。当两个位都是1
时,它执行加法而不进位,就像我们在上面的第一步中所做的那样。
x ^ y
正确添加x
和y
不是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找到没有进位的地方和附加。将两者相加可以统一结果。