看看下面的例子请:为什么〜N在做 - (N + 1)在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)
操作?
看看下面的例子请:为什么〜N在做 - (N + 1)在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)
操作?
因为按位不适用于值的二进制表示。取-5例如,其被表示为:
1111 1111 1111 1111 1111 1111 1111 1011
二进制
(32位)
诺丁该值(翻转每个比特从1
到0
或反之亦然)给你:
0000 0000 0000 0000 0000 0000 0000 0100
这是4位十进制。
当你转换为二进制,它更容易看到发生了什么:
-1 → 11111111 11111111
~-1 → 00000000 00000000 → 0
1 → 00000000 00000001
~1 → 11111111 11111110 → -2
〜运算符是bitwise NOT操作。 〜逐位取操作数,并将0和1变为零。
~ (00010110)b = (11101001)b
现在,负整数使用Two's complement表示,其被精确限定的作为执行按位NOT和加入一种:然后按位NOT相同否定操作数和从其减去一个:
4 = (00000100)b
-4 = (11111100)b
-5 = (11111011)b = ~4
你有答案!
〜是一个二进制不是。它反转一个数字的位。 JavaScript中的所有数字都是带符号的,所以第一位总是符号位。因此正数变成负数,反之亦然。 -1,因为-1是零的倒数。另请参阅Bitwise operators at Mozilla
在JavaScript中,~
是按位“翻转”运算符。这意味着它会颠倒值的二进制表示的位值。它只接受整数值,所以它会强制你传递给int的任何值。
JavaScript [1]中的整数已签名,并使用two's complement系统表示。例如(使用简单的8位):
2: 0000 0010
如果我们的-3
翻转(以二进制补码)其位,我们得到
~2: 1111 1101
这是二进制表示,这是-(2+1)
,正如你指出的出。
[1]实际上表示为浮点数,但这只是使其更加混乱,并且可以忽略实际目的。
难道你不只是问这样的问题吗? – epascarello 2015-02-09 15:20:18
它是按位否定,或*补*。加一个,就得到了* 2的补码*,这是-N最流行的表示。 – molbdnilo 2015-02-09 15:20:43
这是不同的。这是另一个问题。其实我认为这个问题应该被要求知道蒂尔达〜真正起作用,为什么结果是 - (N + 1)。 – 2015-02-09 15:22:16