在这种情况下,"加法"和"按位或"是否相同?

Alb*_*ore 18 c c++ math addition bitwise-operators

假设我有四个32位数字,定义为它们的位不重叠,即

unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
Run Code Online (Sandbox Code Playgroud)

每个号码中的哪个位置可以代替FFs.

我是否正确地说添加按位或者总是会为这种数字产生相同的输出?

谢谢!

And*_*tin 32

只要适用两个数字num1和num2 num1 & num2 == 0,则遵循:

num1 + num2 == num1 | num2

原因是,该加法基本上是一个按位XOR,加上进位.但是只要没有进位(num1 & num2 == 0),那么加法归结为按位异或,num1 & num2 == 0在这种情况下(再次因为)在逻辑上等效于按位OR

  • 说加法是否是一个"XOR"加上一个进位,这不是更准确吗? (5认同)
  • @KyleDelaney该问题的答案不适合在评论框中:) (2认同)

glg*_*lgl 6

是的,as(按位查看)0+1与 相同0|1。唯一的区别是1|1 (=1)vs. 1+1(=0b10),即创建一个 0 并发生溢出,影响左侧的位)。

所以在你的情况下两者是等价的。但为了安全起见,你应该选择不易出错的。


Lin*_*cer 6

不:

num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF
Run Code Online (Sandbox Code Playgroud)

当然,只要您确保仅将您知道它们没有相同位集的东西添加在一起,您应该是安全的。