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

时间:2011-09-07 13:40:17

标签: c++ c math bitwise-operators addition

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

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

每个号码中的哪个位置可以代替FF s。

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

谢谢!

6 个答案:

答案 0 :(得分:30)

只要两个数字num1和num2适用num1 & num2 == 0,然后是:

num1 + num2 == num1 | num2

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:3)

没有

num3 + num3 => 0x000001FE

num3 | num3 => 0x000000FF

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

答案 3 :(得分:1)

只要您没有做num3 + num3之类的事情,是的。

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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