算术+和按位OR之间是否有任何区别。这有什么不同。
uint a = 10;
uint b = 20;
uint arithmeticresult = a + b;
uint bitwiseOR = a | b;
结果都是30。
编辑:小改动以隐藏我的愚蠢。
答案 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,它永远不会产生进位。
你得到的结果相同的事实是 数字同时不产生任何数字 在添加期间携带位。
逐位算术加法
答案 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