C ++如何对负数进行按位“或”操作?

时间:2013-01-14 21:22:04

标签: c++ bitwise-operators bitwise-or

当我给变量这样的值:e = 17|-15;时,我在编译后得到-15作为答案。我无法理解c ++的算术运算。它如何对负小数执行逐位OR运算?

6 个答案:

答案 0 :(得分:19)

它只是对你的数字的二进制表示进行操作。在您的情况下,似乎是two's complement

 17 -> 00010001
-15 -> 11110001

如您所见,这两个数字的按位OR仍为-15

在上面的评论中,您表示您尝试使用两个补码表示,但您必须做错了。这是一步一步:

 15 ->  00001111      // 15 decimal is 00001111 binary
-15 -> ~00001111 + 1  // negation in two's complement is equvalent to ~x + 1
-15 ->  11110000 + 1  // do the complement
-15 ->  11110001      // add the 1

答案 1 :(得分:6)

它对负数进行OR运算与对正数进行OR运算的方式相同。这些数字几乎肯定以二进制形式表示,它给出了这些值:

 17 = 0000000000010001
-15 = 1111111111110001

如您所见,17的所有位都已在-15中设置,因此将它们组合的结果再次为-15。

答案 2 :(得分:3)

   17 = b00010001
  -15 = b11110001 <--- 2s complement
| -15 = b11110001

答案 3 :(得分:3)

按位或带负数的工作只是按位或带正数。一个数字中的位用另一个数字中的位进行存储。处理器如何表示负数是另一回事。大多数人使用称为&#34;两个补码&#34;的东西,基本上是&#34;反转数字并添加1&#34;。

因此,为简单起见,我们有8位数字:

15 is            00001111
Inverted we get  11110000
Add one          11110001

17 is            00010001

Ored together    11110001

答案 4 :(得分:2)

运算符|是“按位OR”运算符,意味着目标中的每个位都被计算为OR - 两个操作数中相应位的组合。这意味着,如果相同位置的数字中的两个位的任何1,则结果中的位为1,否则为0。< / p>

显然,结果取决于数字的二进制表示,这又取决于平台。

几乎所有平台都使用二进制补码,这可以被认为是一个无符号数的圆圈,其中负数与正数相反,并且“环绕”圆圈。

无符号整数:

enter image description here

签名整数:

enter image description here

您的示例计算如下。

 17:   00000000 00000000 00000000 00010001
-15:   11111111 11111111 11111111 11110001
------------------------------------------
-15:   11111111 11111111 11111111 11110001

答案 5 :(得分:1)

你必须看看这些位是如何工作的

基本上,如果某个数字在特定位置有1,那么结果也会有1

-15       : 11110001 (two's complement)
17        : 00010001
-15 | 17  : 11110001

如您所见,结果与-15

相同