当我给一个变量这样的值时:e = 17|-15;
,编译后我得到-15作为答案。我不明白算术c++使用什么。它如何对负小数执行按位或运算?
问问题
13669 次
6 回答
22
它只是对数字的二进制表示进行操作。在您的情况下,这似乎是二进制补码。
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
于 2013-01-14T21:24:37.257 回答
6
它对负数执行 OR 操作的方式与对正数的操作相同。这些数字几乎可以肯定以二进制补码形式表示,它为您提供以下值:
17 = 0000000000010001 -15 = 1111111111110001
如您所见,17 的所有位都已设置为 -15,因此组合它们的结果再次为 -15。
于 2013-01-14T21:25:04.990 回答
3
17 = b00010001
-15 = b11110001 <--- 2s complement
| -15 = b11110001
于 2013-01-14T21:25:09.623 回答
3
按位或负数的工作方式与按位或正数一样。一个数字中的位与另一个数字中的位相或。您的处理器如何表示负数是另一回事。大多数使用称为“二进制补码”的东西,本质上是“反转数字并加 1”。
因此,为简单起见,如果我们有 8 位数字:
15 is 00001111
Inverted we get 11110000
Add one 11110001
17 is 00010001
Ored together 11110001
于 2013-01-14T21:26:54.943 回答
2
该运算符|
是“按位OR
”运算符,这意味着目标中的每个位都被计算为OR
两个操作数中相应位的组合。这意味着,结果中的一个位是1
如果相同位置的数字中的任何两个位是1
,否则0
。
显然,结果取决于数字的二进制表示,而二进制表示又取决于平台。
几乎所有平台都使用二进制补码,可以将其视为一个无符号数字的圆圈,其中负数与正数的方向相反并“环绕”圆圈。
无符号整数:
有符号整数:
您的示例的计算如下。
17: 00000000 00000000 00000000 00010001
-15: 11111111 11111111 11111111 11110001
------------------------------------------
-15: 11111111 11111111 11111111 11110001
于 2013-01-14T21:26:52.463 回答
1
你必须看看这些位是如何工作的
基本上,如果任一数字1
在特定位置有一个,那么结果也将有一个1
-15 : 11110001 (two's complement)
17 : 00010001
-15 | 17 : 11110001
如您所见,结果与-15
于 2013-01-14T21:26:16.660 回答