算术+和按位OR

时间:2010-04-29 05:35:06

标签: c# java

算术+和按位OR之间是否有任何区别。这有什么不同。

uint a = 10;
uint b = 20;

uint  arithmeticresult = a + b;

uint bitwiseOR = a | b;

结果都是30。

编辑:小改动以隐藏我的愚蠢。

7 个答案:

答案 0 :(得分:11)

(10 | 20) == 10 + 20仅因为1位不出现在同一位数。

       1010 = 10
   or 10100 = 20
   ————————
      11110 = 30

然而,

    11 = 3        11 = 3
or 110 = 6     + 110 = 6
——————         ——¹——————
   111 = 7      1001 = 9
#   ^             ^
# (1|1==1)      (1+1=2)

答案 1 :(得分:4)

<强>反例:

2 + 2 == 4 {
{1}}

按位OR表示,对于两个数字中的每个位位置,如果一个或两个位打开,则结果位打开。例如:

2 | 2 == 2

0b01101001 | 0b01011001 = 0b01111001 是某些编程语言支持的二进制文字的前缀)

在位级别,加法类似于按位OR,除了它带有:

0b

在你的情况下,10 + 20和10 | 20碰巧是相同的,因为10(0b01101001 + 0b01011001 = 0b11000010 )和20(0b1010)没有共同的1,这意味着没有进位。

答案 2 :(得分:4)

尝试设置a = 230和b = 120.您将观察结果的差异。

原因很简单。在算术加法运算中,逐位加法运算可以产生进位位,其在随后位置上可用的位对的下一位逐位加法中相加。但是如果是逐位OR,它只执行ORing,它永远不会产生进位。

  

你得到的结果相同的事实是   数字同时不产生任何数字   在添加期间携带位。

逐位算术加法

alt text http://www.is.wayne.edu/drbowen/casw01/AnimAdd.gif

答案 3 :(得分:1)

按位OR遍历两位数的每一位并应用以下真值表:

A  B  | A|B
0  0  |  0
0  1  |  1
1  0  |  1
1  1  |  1

同时算术运算符实际上经过了应用下表的每一位(其中c是进位,a和b是数字的位,s是总和,c'是执行):< / p>

C  A  B  | S  C'
0  0  0  | 0  0
0  0  1  | 1  0
0  1  0  | 1  0
0  1  1  | 0  1
1  0  0  | 1  0
1  0  1  | 0  1
1  1  0  | 0  1
1  1  1  | 1  1

由于显而易见的原因,进位开始为0。

正如您所看到的,总和实际上要复杂得多。但是,作为这样的副作用,您可以在添加正有符号数时检测溢出。更具体地说,我们期望a + b> = a | b如果失败则会出现溢出!

当两个数字相同时的情况是每当设置两个数字之一中的某个位时,不设置第二个数字中的相应位。也就是说你有三种可能的状态:要么两个位都没有置位,要么在A中设置而不是在B中设置,要么在B中设置该位但不在A中设置。在这种情况下,算术+和位 - 明智的或会产生相同的结果......就像那个问题的按位xor一样。

答案 4 :(得分:1)

使用算术运算来操作位掩码会产生意外结果甚至溢出。例如,如果位掩码的第n位已经打开,则将其打开将关闭第n位并打开第n + 1位。如果只有n位,这将导致溢出。

启用第2位的示例:

Arithmetic ADD      Bitwise OR
          0101            0101                                           
        + 0100          | 0100     
          ----            ----                                           
          1001            0101    //expected result: 0101                              

同样地,如果第n位尚未打开,则使用算术减法关闭第n位将失败。

关闭第2位的示例:

Arithmetic SUB      Bitwise AND~
          0001              0001 
        - 0100           &~ 0100
          ----              ----
          0001              0001
        + 1100           &  1011
          ----              ----
          1101              0001   //expected result: 0001

当你使用位掩码时,位运算符比算术运算符更安全。

以下按位运算具有类似的算术运算:

                    Bitwise            Arithmetic 
Check n-th bit      x  &  (1 << n)   !(x  - (1 << n))
Turn on n-th bit    x |=  (1 << n)     x += (1 << n)
Turn off n-th bit   x &= ~(1 << n)     x -= (1 << n)

答案 5 :(得分:0)

尝试a = 1且b = 1;) +和|当相同位置的两个位是1时,它们会有所不同

答案 6 :(得分:0)

  00000010

OR

  00000010

Result

  00000010

VS

  00000010

+

  00000010

Result

  00000100
相关问题