2016-05-12 125 views
11

注意:以下所有二进制表示都应该从右到左读取。我不确定为什么我会这样想,但我其实并不知道人们也是从左到右代表二进制。混乱!JavaScript中为什么〜5 === -6?

对于JavaScript的按位运算符MDN的文章(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Bitwise_NOT)它说~运算符是按位运算符NOT

On Wikipedia(https://en.wikipedia.org/wiki/Bitwise_operation#NOT)它表示“按位NOT或补码是一个一元操作,对每个位执行逻辑否定,形成给定二进制值的1的补码,0为1的位和那些是1变成0.“

现在,走在二进制数5:0101

如果我在浏览器控制台输入~5,我得到-6其二进制表示1110。我预计否定将0101转换为1010,实际上是10(如果最左边的数字是符号,则为-2)。

我读到的JavaScript的~运算符的所有解释都表示它将数值计算为 - (x + 1),但这并不能从逻辑上向我解释该运算符在“按位”级别执行的操作。

基本上,0101变成1110

见证这种转变的中间步骤是什么?我看到领先的位被翻转,从而改变了标志。但这就是我能够收集到的一切。

+3

转到这里运行:http://stackoverflow.com/questions/31377474/why-does-bitwise-not-1-equal-2 –

+0

这是相同的所有计算机使用2补码系统负数 – Soren

+2

[〜x == = - (x + 1): - )](http://stackoverflow.com/questions/34349350/what-does-xy-represent-in-javascript).. – choz

回答

3

它确实执行了一次按位不是,负数在two's complement。所以价值1010-6

两个补码基本上工作在最左边的位表示一个负数,并被视为一个负值。所有其他1位被添加到这个数字。例如:

1010 => (-8 +0 +2 +0) => -6 
1111 => (-8 +4 +2 +1) => -1 
2

Why does bitwise "not 1" equal -2?是一样的想法。
Cerebrus在上述链路的答案(BINARY的R - > L):
有-1和-2之间的整数2:0和-1

1二进制是00000000000000000000000000000001
0二进制是00000000000000000000000000000000
-1二进制是11111111111111111111111111111111
-2二进制是11111111111111111111111111111110
( “二进制” 为2的补码,在逐位的情况下不〜)

+0

这我明白(我认为)。对我来说,1是'001',-2是'110',它是倒数位的1。但是简单地颠倒这些位并不会将5变成-6。 – papiro

+0

我现在看到我的困惑!最左边的位不仅仅用于表示符号,还包括负数中的某些东西。所以'110'在我看来像负两个零,但实际上是(-4)-2-0加起来都是-2!棘手棘手 – papiro

2

通过认识到第一位是符号,您已经非常接近解决方案,但是其余位未按原样使用。事实上,在计算中,有符号数由二进制补码表示。

有关于Wikipedia和其他各种网站的概念的详细文章,但总而言之,当第一位是1(表示负数)时,其余的位组成了一个数字,基本上显示了您添加到最小数量(例如,在一个8位整数中,最小值为-256,即11111111,所以反相5(00000101)变成11111010或250,所以你可以通过将250加到-256得到小数点,然后得到-6)。这个解释是对十进制系统的简化,但为了充分理解这种工作方式,你应该阅读关于二进制补码的整篇文章。

2

您正在由符号位混乱,在其被放置....

扩展比特(到例如8个比特的非常短整型)的数目并查看

00000110 6 

位反转〜

00000101 5 
11111010 ~5 (bitwise inversion of 5) 

而且从零

00000000 0 
11111111 -1 
11111110 -2 
11111101 -3 
11111100 -4 
11111011 -5 
11111010 -6 
递减计数

所以

11111010 -6 

11111010 ~5 

是一样的。

这是真实的不仅为JavaScript,但它运行的是基于2补数系统的计算机上的任何东西 - 不知道的JavaScript曾经在别的:-)

相关问题