2015-02-09 24 views
2

看看下面的例子请:为什么〜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)操作?

+0

难道你不只是问这样的问题吗? – epascarello 2015-02-09 15:20:18

+1

它是按位否定,或*补*。加一个,就得到了* 2的补码*,这是-N最流行的表示。 – molbdnilo 2015-02-09 15:20:43

+1

这是不同的。这是另一个问题。其实我认为这个问题应该被要求知道蒂尔达〜真正起作用,为什么结果是 - (N + 1)。 – 2015-02-09 15:22:16

回答

4

它恢复所有比特数,和整数的比特表示如下(3位数字):

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

它的工作原理分别为更大的数字。

所以通过服用~-2你有~(110b),这就等于001b那就是1

+1

将0改为1,将1改为0 – Krzysztof 2015-02-09 15:23:51

+0

正如我的回答所解释的,这是因为二进制补码表示整数。例如,如果使用补码,它将是整数否定。 – Esteban 2015-02-09 15:37:40

2

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

1111 1111 1111 1111 1111 1111 1111 1011 
二进制

(32位)

诺丁该值(翻转每个比特从10或反之亦然)给你:

0000 0000 0000 0000 0000 0000 0000 0100 

这是4位十进制。

1

当你转换为二进制,它更容易看到发生了什么:

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

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

〜运算符是bitwise NOT操作。 〜逐位取操作数,并将0和1变为零。

~ (00010110)b = (11101001)b 

现在,负整数使用Two's complement表示,其被精确限定的作为执行按位NOT和加入一种:然后按位NOT相同否定操作数和从其减去一个:

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

你有答案!

1

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

1

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

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

2: 0000 0010 

如果我们的-3翻转(以二进制补码)其位,我们得到

~2: 1111 1101 

这是二进制表示,这是-(2+1),正如你指出的出。

[1]实际上表示为浮点数,但这只是使其更加混乱,并且可以忽略实际目的。

相关问题