【问题标题】:Are 'addition' and 'bitwise or' the same in this case?在这种情况下,“加法”和“按位或”是否相同?
【发布时间】:2014-01-07 07:43:23
【问题描述】:

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

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

在每个数字中,可以用任何东西代替FFs。

我说的对吗?additionbitwise or 对于这种类型的数字总是会产生相同的输出?

谢谢!

【问题讨论】:

  • 作为第三种选择,您还可以使用异或,即^ 运算符。
  • 但请注意,如果您想将这些数字合并为一个,使用| 是一种不错的方式。

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


【解决方案1】:

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

num1 + num2 == num1 | num2

这样做的原因是,加法基本上是按位异或,进位。但只要没有进位位(num1 & num2 == 0),加法就归结为按位异或,在这种情况下(再次因为num1 & num2 == 0)在逻辑上等价于按位或

【讨论】:

  • 按位加法是XOR 加进位不是更准确吗?
  • 一个比另一个快吗?
  • @KyleDelaney 该问题的答案不适合评论框:)
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    没有:

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

    当然,只要你确保只在你知道它们没有设置相同位的情况下将它们相加,你就应该是安全的。

    【讨论】:

    • 对不起,我忘了隐式排除这种情况。
    • 因为你下次会再次忘记它(每个人都会)总是使用|作为逻辑表达式。 - 与您真正进行计算时相比,例如,在十进制表示也有意义的情况下。
    【解决方案4】:

    只要你不做num3 + num3之类的事情,就可以。

    【讨论】:

      【解决方案5】:

      每当按位加法添加多个 1 时(因为源有它们,或者来自另一个地方的进位也是 1),然后产生一个进位并且一个地方影响另一个地方。只要在一个加法中最多加一个 1,则与按位或相同。

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-23
          • 1970-01-01
          • 2012-10-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多