有人可以一步一步解释我如何得到-9值作为结果?

时间:2016-11-26 05:06:37

标签: java

我执行了此(~(1 << 3))声明,结果我得到了-9

声明:(~(1 << 3))

结果:-9

2 个答案:

答案 0 :(得分:4)

计算机中的数字存储在2's complement form

原始数字为1,二进制为0...0001。我正在跳过第4到第30位,因为它们都将为零(考虑32位系统)。

执行1 << 3会产生0...1000,即+8。简单来说,它意味着将{1}乘以2^i,其中i = 3

现在,反转这会产生1111 1111 1111 1111 1111 1111 1111 1000,这是2的补码形式的负数。

要获取数字的值,请删除前1(符号位),再次反转整个数字并添加1.

因此,再次反转会给你0...1000。向此添加1,因此0...1001

这是数字的值为9.并且符号为负,因为第一个符号位为1.

答案 1 :(得分:2)

<<left-shift运算符,简单来说,当应用于数字时,将其乘以2^i,其中i是要添加的位数转移,例如:

1 << 3 = 8  (multiply 1 by 2^3)
2 << 4 = 32 (multiply 2 by 2^4) 

~NOT运算符,它将数字中的每个位取出并切换它。简单来说,~x = -x - 1例如:

~100102 = 011012
~8 = -9

现在回答你的问题(~(1 << 3)) = (~8) = -9。有关详情,请查看以下答案:NOT(~) vs NEGATION(!)