加法的逐位操作

Bitwise operation for add

本文关键字:位操作      更新时间:2023-10-16

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

我正在从比特逻辑中寻找一些规则来解释这个数学等价物。

这就像解决一个普通的基数10加法问题955 + 445,首先将所有列单独相加,然后丢弃携带的1s:

955
445
-----
390

然后找到应该有进位1:的所有列

955
445
-----
101

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

390
+ 1010
------
1400

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

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

x ^ y正确地将xy不同时为1:的所有比特相加

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

CCD_ 12在所有列中给我们一个CCD_。这些正是我们错过进位的栏目:

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

当然,当你在加法时携带1时,你会把它向左移动一个位置,就像你在基数10中加法一样。

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

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

但是,由于=表示赋值,而非零值表示true,因此对于大多数值,上面的表达式将计算为true。==将测试是否相等。

EDIT
x ^ y + ((x & y) << 1)用括号表示正确。AND查找进位发生的位置,移位进行进位。XOR查找没有进位的情况下加法发生的位置。把两者加在一起就统一了结果。