如何C ++做的按位“或”对负数操作?(How does C++ do bitwise “or” o

2019-07-18 05:12发布

当我给一个变量,例如值: e = 17|-15; ,我得到-15作为compiling.I后一个答案不能明白算术C ++使用。 它是如何进行逐位或运算负小数?

Answer 1:

它只是在做你的数字的二进制表示的操作。 在你的情况,这似乎是两个互补 。

 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


Answer 2:

它或操作上的负数它这样做的正数一样。 这些数字几乎肯定代表了二进制补码形式,它给你这些值:

 17 = 0000000000010001
-15 = 1111111111110001

正如你所看到的,17所有位在-15都已经确定,所以将它们结合起来的结果再次为-15。



Answer 3:

与负数的按位或工作就像按位或正数。 在一个数目的位进行或运算与其他数目的位。 你的处理器如何表示负数则另当别论。 大多数使用所谓的“补”,基本上是“颠倒的数量加1”。

所以,如果我们有,为了简单起见,8个数字:

15 is            00001111
Inverted we get  11110000
Add one          11110001

17 is            00010001

Ored together    11110001


Answer 4:

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


Answer 5:

运营商| 是一个“按位OR ”操作符,这意味着在目标的每一位被计算为OR的两个操作数的相应位的结合- 。 这意味着,在结果的位为1 ,如果在任何在相同位置的数目的两个比特的是1 ,否则0

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

几乎所有的平台都使用二进制补码 ,它可以被看作是无符号数的圈子,其中负数只是比正数向相反的方向和“环绕”的圈子。

无符号整数:

符号整数:

你的榜样的计算如下。

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


Answer 6:

你必须着眼于位是如何工作的

基本上,如果任一号码有1在一个特定的点,比结果也将有一个1

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

正如你所看到的,结果是一样的-15



文章来源: How does C++ do bitwise “or” operations on negative numbers?