为什么~N在JavaScript中做 - (N + 1)?

时间:2015-02-09 15:17:46

标签: javascript

请看下面的例子:

console.log(~-2); //1
console.log(~-1); //0
console.log(~0); //-1
console.log(~1); //-2
console.log(~2); //-3
console.log(~true); //-2
console.log(~false); //-1

为什么~N的运作方式与-(N + 1)相同?

6 个答案:

答案 0 :(得分:4)

它恢复所有位的数量,整数的位表示如下(对于3位数字):

-4 = 100b
-3 = 101b
-2 = 110b
-1 = 111b
 0 = 000b
 1 = 001b
 2 = 010b
 3 = 011b

它分别适用于更大的数字。

因此,~-2~(110b) 001b,等于1且{{1}}。

答案 1 :(得分:4)

〜运算符是bitwise NOT运算符。 〜逐位取操作数,用零和1改为零。

~ (00010110)b = (11101001)b

现在,负整数用Two's complement表示,它被精确定义为按位NOT执行并添加一个:然后按位NOT与否定操作数和减去一个相同:

 4 = (00000100)b
-4 = (11111100)b
-5 = (11111011)b = ~4

你有答案!

答案 2 :(得分:2)

因为按位不适用于值的二进制表示。以-5为例,表示为:

1111 1111 1111 1111 1111 1111 1111 1011

二进制(32位)

注明该值(将每个位从1翻转到0或反之亦然)会为您提供:

0000 0000 0000 0000 0000 0000 0000 0100

小数点是4。

答案 3 :(得分:1)

当您转换为二进制文件时,更容易看到发生了什么:

 -1 → 11111111 11111111
~-1 → 00000000 00000000 →  0

  1 → 00000000 00000001
 ~1 → 11111111 11111110 → -2

答案 4 :(得分:1)

〜是二进制而不是。它反转了一个数字位。 JavaScript中的所有数字都是有符号的,因此第一位始终是符号位。因此正数变为负数,反之亦然。 -1因为-1是零的倒数。另请参阅Bitwise operators at Mozilla

答案 5 :(得分:1)

在JavaScript中,~是按位“翻转”运算符。这意味着它将反转值的二进制表示的位值。它只接受整数值,因此它会强制传递给int的任何值。

JavaScript [1]中的整数已签名,并使用two's complement系统表示。例如(为简单起见使用8位):

2: 0000 0010

如果我们翻转它们,我们得到

~2: 1111 1101

这是-3的二进制表示(以二进制补码),即-(2+1),正如您所指出的那样。

[1]实际上表示为浮点数,但这使它更容易混淆,并且可以忽略实际用途。