加法的逐位操作
Bitwise operation for add
本文关键字:位操作 更新时间:2023-10-16
你能帮我弄清楚为什么下面的表达式是真的吗x+y=x^y+(x&y)<lt;1
我正在从比特逻辑中寻找一些规则来解释这个数学等价物。
这就像解决一个普通的基数10加法问题955 + 445
,首先将所有列单独相加,然后丢弃携带的1
s:
955
445
-----
390
然后找到应该有进位1
:的所有列
955
445
-----
101
将其转移并添加到原始结果中:
390
+ 1010
------
1400
所以基本上你是在做加法,但忽略所有进位的1
s,然后在后面加上进位的,作为一个单独的步骤。
在基2中,当任一位是0
时,XOR(^
)正确地执行加法。当两个比特都是1
时,它执行无进位加法,就像我们在上面的第一步中所做的那样。
x ^ y
正确地将x
和y
不同时为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查找没有进位的情况下加法发生的位置。把两者加在一起就统一了结果。
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 在数组大小中使用位操作的原因
- 了解C++位操作中的二进制转换实现