【问题标题】:How does bitwise signed symbol work ~位符号符号是如何工作的~
【发布时间】:2018-11-16 11:03:37
【问题描述】:

所以,我查看了几个网站,但仍然不明白按位运算符 ~ 的作用。基本上,我知道对于像 4 这样以二进制表示为 100 的数字,当您将 ~4 放入 011 时应该翻转;但是,似乎以某种方式变成了-5,然后教程说了一些关于负载为负数的 32 位表示。在这一点上我完全迷路了,请解释一下 ~ 是如何工作的。

【问题讨论】:

  • 所以您问的是二进制中带符号的数字是什么样的?我向你保证这不是随机的。
  • @DaveNewton 它如何转换为-5
  • 请在网上搜索二进制数表示。二进制补码。

标签: javascript node.js algorithm frontend bitwise-operators


【解决方案1】:

数字 4 不是100。这是00000000000000000000000000000100~ 将所有这些零翻转为 1。

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

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

二进制数学和现代计算机(嗯,几乎所有历史计算机也是如此)的方式是一个广泛的主题。一些编程语言提供的抽象主要隐藏了计算硬件实际如何工作的现实;在大多数实现中,JavaScript 并不是真正的其中一种语言。

【讨论】:

  • 为什么11111111 11111111 11111111 11111011变成-5?
  • 因为这就是计算机解释这 32 位的方式。它被称为二的补码算术。所有现代计算硬件都以这种方式工作。
  • 我认为您应该从关于按位运算符将数字转换为临时 32 位整数的句子开始回答。否则第一段感觉有点奇怪,因为 JavaScript 中的所有数字都是 IEEE754 64 位双精度数。
  • @Paulpro 好吧,我同意它并不完美,但 OP 对于二进制数学和计算硬件的现实显然是全新的。我的观点实际上是“奇怪”和大开眼界。
【解决方案2】:

4 = 00000000 00000000 00000000 00000100

~4 = 11111111 11111111 11111111 11111011

因为最左边的位是带符号的 32 位值中的 sign bit,这就是负值的来源。稍微相关:您可能还想阅读MSBLSB

【讨论】:

  • 基本正确,但 JavaScript 位运算符适用于 32 位值,而不是 8 位值。
  • 是的,原理相同,只是不想输入所有 32 位。但现在我有了。
  • 感受你的痛苦:)
  • @RobIII 为什么 11111111 11111111 11111111 11111011 变成-5?
  • @user2101 因为这就是二进制数的工作方式。阅读Two's complement。到现在已经不止一次提到了。
猜你喜欢
  • 2013-07-06
  • 2010-10-13
  • 2012-02-10
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
相关资源
最近更新 更多