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

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

unsigned long int num0 = 0xFF000000; unsigned long int num1 = 0x00FF0000; unsigned long int num2 = 0x0000FF00; unsigned long int num3 = 0x000000FF; 

在每个号码中,在FF的位置可以有任何东西。

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

谢谢!

只要两个数字num1和num2应用num1 & num2 == 0 ,则如下:

num1 + num2 == num1 | num2

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

是的,因为(看到按位) 0+10|1相同。 唯一的区别是1|1 (=1)1+1(=0b10) ,即创建一个0并且有溢出,影响左边的位。

所以在你的情况下两者都是等价的。 但是你应该安全地选择容易出错的那个。

没有:

 num3 + num3 => 0x000001FE num3 | num3 => 0x000000FF 

当然,只要你确保只在你知道它们没有设置相同位的地方添加东西,你就应该是安全的。

只要你没有做像num3 + num3这样的事情,是的。

每当按位加法增加多于1(或者因为源有它们,或者来自另一个地方的进位也是1),则产生进位并且一个地方影响另一个。 只要添加最多添加1个,就像按位或者一样。

当我们查看加法器电路(http://en.wikipedia.org/wiki/Adder_%28electronics%29)时,也可以看到这一点,当没有产生进位时,参与电路的所有元件都是“或” “元素。

加法和逐位或者与逐位相同或者包含任何位中的任何位,并且考虑到位的互斥性质,正常加法将完全相同。