在这种情况下,“加法”和“按位或”是否相同?
假设我有四个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+1
与0|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)时,也可以看到这一点,当没有产生进位时,参与电路的所有元件都是“或” “元素。
加法和逐位或者与逐位相同或者包含任何位中的任何位,并且考虑到位的互斥性质,正常加法将完全相同。