这个方程 x + y = x & y + x |y 成立(假设 x, y > 0)?
How does this equation x + y = x & y + x | y hold true ( assuming x, y > 0)?
我最近参加了一个代码力量竞赛。在比赛的编辑部分,我看到了按位运算符之间的一种美丽关系,即 x + y = x & y + x |y.我还不知道证据。我拿了几个数字,看看这个等式是否成立。我很兴奋地知道这个证据。我在网上查了一下,找不到任何有意义的参考资料。请帮我找到证据,或者至少给我这个美丽方程式背后的直觉。提前致谢
假设你正在做a + b
。
请注意,将a
的第 i 位数字(从最右侧的数字开始计数(与b
的第 i 位数字交换不会影响总和。示例:123 + 456 == 156 + 423
.无论选择什么基数,这都有效,因此它也适用于二进制加法。
接下来,请注意,从a + b
到a&b + a|b
的转换可以通过以上述方式(二进制(交换一些数字来完成。如果a[i] == 1
和b[i] == 0
,则交换a[i]
并b[i]
;之后,a
变得a&b
,b
变得a|b
。因此,这种转换不会影响结果。
因此,每当您尝试计算按位计算时,最简单的方法是为所有情况制作图表,尤其是当变量只有这么小时。
A | B | A AND B | A OR B | A + B | (A AND B) + (A OR B)
---+---+---------+--------+---------------+----------------------
0 | 0 | 0 | 0 | 0 + 0 = 0 | 0 + 0 = 0
---+---+---------+--------+---------------+----------------------
0 | 1 | 0 | 1 | 0 + 1 = 1 | 0 + 1 = 1
---+---+---------+--------+---------------+----------------------
1 | 0 | 0 | 1 | 1 + 0 = 1 | 0 + 1 = 1
---+---+---------+--------+---------------+----------------------
1 | 1 | 1 | 1 | 1 + 1 = 2 | 1 + 1 = 2
现在,您可能能够看到:
- 如果
A == B
,则A + B
和A & B + A | B
本质上是相同的。 - 如果
A != B
,那么A & B + A | B
可能会改变两个值的顺序,但当然,A+B=B+A,所以它们本质上与while相同。
对于x和y,你可以把位拆开,把它们加在一起,得到相同的答案,对吗?
例:
0101 (x) + 0110 (y) == (0100 + 0001) + (0100 + 0010)
现在。 查看逻辑运算符:a & b
为您提供两个数字中的位数(读取:计数为 2(a | b
提供任一数字中的位(读取:计数 ≥1(
所以基本上,你把任何一个数字中的位,把它们相加:
0111 == 0100 (in x, y) + 0010 (in y) + 0001 (in x)
您还将两个数字中的位(即需要计数两次的位(相加,并将其添加到总和中:
0100 == 0100 (in x, y)
因此,您最终会添加出现一次、一次的位和出现两次、两次的位:
0111 (bits that appear once or twice) + 0100 (bits that appear twice)
相关文章:
- EASTL矢量<向量<int>>连续的
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 这个方程 x + y = x & y + x |y 成立(假设 x, y > 0)?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 围绕"?"使用的混淆,因为没有假设值
- 假设 a 是双倍的,2.0*a 比 2*a 快吗?
- 假设CPU的解码指令
- 如何使用C++中不是文字的变量在数字中显示单引号和两个引号?假设 6'2" 英尺
- 假设传递给 OpenGL 的结构数组的内存布局存在潜在错误
- 假设相同的 lambda 表达式具有不同的类型是否安全?
- 本征是否假设混叠?
- 假设容器值将自动创建是不好的做法吗?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么 constexpr 假设我的方法就是 const
- 假设 C++11 中已知子级布局,重新插入基类是否安全
- 我可以依靠 TCHAR 的定义对我正在使用的字符集做出正确的假设吗?
- 假设包含所有必需的头文件,输出将是什么
- 告诉 GCC 假设对象已初始化
- C 字符串比较“祝您好运”&gt;“再见”
- 假设浮点数或双 NaN 将始终作为字符串"nan"是否安全?