假设我有四个 32 位数字,定义为使它们的位不重叠,即
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
在每个数字中,都可以有任何东西来代替FF
s。
我是否正确地说加法和按位或总是会为此类数字产生相同的输出?
谢谢!
假设我有四个 32 位数字,定义为使它们的位不重叠,即
unsigned long int num0 = 0xFF000000;
unsigned long int num1 = 0x00FF0000;
unsigned long int num2 = 0x0000FF00;
unsigned long int num3 = 0x000000FF;
在每个数字中,都可以有任何东西来代替FF
s。
我是否正确地说加法和按位或总是会为此类数字产生相同的输出?
谢谢!
只要对两个数字 num1 和 num2 适用num1 & num2 == 0
,则如下:
num1 + num2 == num1 | num2
原因是,加法基本上是按位异或,加上进位。但是只要没有进位num1 & num2 == 0
(num1 & num2 == 0
不:
num3 + num3 => 0x000001FE
num3 | num3 => 0x000000FF
当然,只要您确保仅在您知道它们没有设置相同位的情况下将它们添加在一起,那么您应该是安全的。
是的,因为(按位查看)0+1
与0|1
. 唯一的区别是1|1 (=1)
vs. 1+1(=0b10)
,即创建一个 0 并溢出,影响左边的位)。
所以在你的情况下,两者都是等价的。但是你应该去安全的一面,选择不太容易出错的那个。
只要你不做类似的事情num3 + num3
,是的。
每当按位加法添加超过一个 1(因为源有它们,或者来自另一个地方的进位也是 1)时,就会产生一个进位并且一个地方影响另一个地方。只要在一个加法中最多加一个1,就和按位或一样。
当我们查看加法器电路时也可以看到这一点(http://en.wikipedia.org/wiki/Adder_%28electronics%29),当不产生进位时,参与电路的所有元素都是“或“元素。
加法和按位或将与按位相同或将包含任何位,并且鉴于您的位的互斥性质,正常加法将完全相同。