【问题标题】:">>1" equals "/2"? [duplicate]“>>1”等于“/2”? [复制]
【发布时间】:2012-01-17 16:48:04
【问题描述】:

可能重复:
>> in javascript

这里:

var num=10;
console.log(num/2);
num=4;
console.log(num/2);

它给了我52

还有这个:

var num=10;
console.log(num>>1);
num=4;
console.log(num>>1);

它还给了我52
那么x/2x>>1 一样吗?但为什么呢?

【问题讨论】:

  • 你熟悉整数的二进制表示吗?
  • 我认为你只需要了解>> 运算符的作用...
  • 谷歌搜索“位移操作”
  • 那我应该使用>>1来优化我的代码吗?
  • @Derek:除非您可以证明(通过基准测试)1)包含除法的代码段是您的应用程序中的瓶颈,并且 2)将除法更改为移位实际上可以提高性能。大多数编译器都会为您执行此操作,因此一般来说,将除法更改为移位只会导致具有同等性能的代码可读性降低。

标签: javascript binary bit-manipulation


【解决方案1】:

出于同样的原因,从普通(十进制)数字中删除最后一位数字与将其除以 10 相同(当然,忽略任何非整数余数)。

在计算机中,整数在内部以二进制(以 2 为底)表示。因此,每个数字都代表 2 的幂,而不是我们习惯于使用十进制系统的 10 的幂。

>> 1 只是意味着将所有位右移一位,这是“删除最后一位”的另一种说法。由于数字是二进制的,这相当于除以基数,即 2。

同样,如果您需要除以 2 的任意幂,您可以使用右移运算符来实现:除以 4,移位 2;除以 8,移位 3;等等。

请注意,在内部,执行移位操作而不是除法操作通常更有效,但任何值得其盐的编译器都会为您执行此优化(因此您不必编写混淆代码来获得性能好处——一般来说,当你打算直接操作位时,你只会使用移位运算符,而当你打算做数学时,你会使用除法运算符。

【讨论】:

    【解决方案2】:

    当您 >> 某物时,您基本上将其所有位向右移动。 发生这种情况时,您将 2 位值转换为 1 位值,将 4 位值转换为 2 位值,依此类推。 这有效地将一个数字分成两半。 以数字 14 为例: 1110。 当你移动位时,你得到 111 或 7。

    看看这个: http://en.wikipedia.org/wiki/Division_by_two#Binary

    【讨论】:

      【解决方案3】:

      您需要了解的有关>> 的所有信息都可以在herehere 中找到。

      【讨论】:

        【解决方案4】:

        x>>1 是一个位移位,它作用于数字的binary representation。效果是x>>nx/(2^n) 相同(除了位移通常比除法更快,因为它是较低的级别)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-07-04
          • 2021-10-31
          • 2013-08-17
          • 1970-01-01
          • 2018-09-01
          • 1970-01-01
          • 2022-04-12
          • 2015-09-02
          相关资源
          最近更新 更多