Javascript 按位符号是如何工作的~

Javascript 按位符号是如何工作的~,javascript,node.js,algorithm,frontend,bitwise-operators,Javascript,Node.js,Algorithm,Frontend,Bitwise Operators,所以,我看了好几个网站,仍然不明白按位运算符~的作用。基本上,我理解,对于像4这样的数字,当你把~4放到011时,二进制表示为100的数字应该被翻转;然而,似乎有某种程度上变成了-5,然后教程说了一些关于32位表示和负数加载的内容。此时我完全不知所措,请解释~的工作原理。数字4不是100。它是000000000000000000100。所有这些零都被~翻转为1 结果数字是负数,因为当转换回普通JavaScript数字时,这些32位值是如何解释的。但我已经超越了自己:JavaScript中的逐位运

所以,我看了好几个网站,仍然不明白按位运算符~的作用。基本上,我理解,对于像4这样的数字,当你把~4放到011时,二进制表示为100的数字应该被翻转;然而,似乎有某种程度上变成了-5,然后教程说了一些关于32位表示和负数加载的内容。此时我完全不知所措,请解释~的工作原理。

数字4不是
100
。它是
000000000000000000100
。所有这些零都被
~
翻转为1

结果数字是负数,因为当转换回普通JavaScript数字时,这些32位值是如何解释的。但我已经超越了自己:JavaScript中的逐位运算符所做的第一件事是从源代码创建一个临时的32位整数值。然后运算符执行它的魔术,在
~
的情况下,它将反转该32位值的所有位。然后将数字转换回64位双精度浮点值,这是正常的JavaScript数字类型

32位值被解释为有符号值,这与计算机算术的工作方式有关。只需说明,其最左边(最高有效)位为
1
的任何32位值都被解释为负值


二进制数学和现代计算机(几乎所有历史上的计算机)的运算方式是一门广泛的学科。一些编程语言提供的抽象大多隐藏了计算硬件实际工作的真实情况;在大多数实现中,JavaScript并不是真正的那种语言。

4
=
00000000000000000000000000

~4
=
11111111111111111111111111111 011


因为最左边的位是有符号的32位值中的值,这就是负值的来源。稍微相关:您可能还想进一步了解,。

基本正确,但JavaScript逐位运算符使用32位值,而不是8位值。是的,相同的原理,只是不想键入所有32位。但是现在我有了。感受一下你的痛苦:)@RobIII为什么111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111。仔细阅读。现在已经不止一次提到过它了。所以你在问一个有符号的数字在二进制中是什么样子的?我向你保证它不是随机的。@DaveNewton它如何转换为-5请在web上搜索二进制数表示形式。两个s-补码。为什么11111111111111111111111111111111111111111111111111111变成-5?因为计算机就是这样解释这32位的。这叫做二的补码运算。所有现代计算硬件都是这样工作的。我认为你应该从一句关于按位运算符将数字转换为临时32位整数的话开始回答。否则,第一段感觉有点奇怪,因为JavaScript中的所有数字都是IEEE754 64位双精度的。@Paulpro我同意这不太完美,但OP显然对二进制数学和计算硬件的实际情况来说是全新的。事实上,我的观点是“怪异”和大开眼界。