请看下面的例子:
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)
相同?
答案 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]实际上表示为浮点数,但这使它更容易混淆,并且可以忽略实际用途。