【问题标题】:I don't understand bit shifts我不明白位移
【发布时间】:2019-01-29 03:59:29
【问题描述】:

我了解偏移运算符对数字执行乘法和除法。因此,当我有 80 >> 3 时,我将其翻译为将 80 除以二、三倍。当我看到这个 80

【问题讨论】:

  • why is 1>>32 == 1?的可能重复
  • 您需要指定您正在谈论的编程语言。运算符的行为是特定于语言的。但对于 Java,请参阅链接问题。
  • @StephenC 我说的是 Python 和 Node.js。
  • 他们的行为不同。 Javascript遵循Java模型;见ecma-international.org/ecma-262/5.1/#sec-11.7。对于 python,规范说 a << N 等同于 a * pow(2, N) ...截断为整数。
  • 除非您的语言中的整数是 103 位(或任意精度)类型,否则 9*2^99 显然不适合该类型并会溢出

标签: bit-manipulation bitwise-operators bit bit-shift


【解决方案1】:

关于移位要记住的一点是,您的值只有有限的位数,并且(至少对于原始值类型)位数将小于 99。

事实上,如果您在启用警告的情况下编译代码,您可能会看到如下警告:

`warning: shift count >= width of type [-Wshift-count-overflow]`

... 那是编译器告诉您您尝试执行的操作会调用未定义的行为。您要移动的值很可能是 32 位或 64 位长(取决于您的代码和/或您正在编译的计算机),因此向左移动比这更多的位是无效的。

【讨论】:

  • 我在 Node.js 上,怎么样?
  • 我建议将 node.js 添加到您问题中的标签中,以使读者明白这一点。
猜你喜欢
  • 2021-05-13
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-08
  • 2017-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
相关资源
最近更新 更多