这个问题在这里已有答案:
- 为什么按位“不是1”等于-2? 7个答案
起源
答案:
它确实执行了一个不正确的NOT,负数是在 两个补充。所以价值 1010
是 -6
。
二进制补码基本上由最左边的位表示负数而被视为负值。所有其他1位都添加到此数字。例如:
1010 => (-8 +0 +2 +0) => -6
1111 => (-8 +4 +2 +1) => -1
为什么按位“不是1”等于-2? 是一样的想法。
Cerebrus在上面链接中的答案(BINARY R - > L):
1和-2:0和-1之间有2个整数
二进制1是00000000000000000000000000000001
二进制0是00000000000000000000000000000000
二进制-1是11111111111111111111111111111111
二进制-2是11111111111111111111111111111110
(“二进制”是2的补码,在按位的情况下不是〜)
通过意识到第一位是符号,你已经非常接近解决方案,但是,其余的位不是“原样”使用的。实际上,在计算中,带符号的数字用二进制补码表示。
有关于这个概念的详细文章 维基百科 和其他各种网站一样,但简而言之,当第一位为1(表示负数)时,其余位构成一个数字,基本上显示您添加到最小数字的数量(例如,在8位整数中)最小值是-256 11111111
所以反转5(00000101
)成为 11111010
或250,所以你可以通过添加250到-256得到小数,你得到-6)。这个解释是对十进制系统的简化,但是为了充分理解它是如何工作的,你应该真正阅读关于二进制补码的整篇文章。
你被标志位和放置位置弄糊涂了....
扩展位数(例如,非常短的8位int)并查看
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是否曾运行过任何其他内容:-)