JavaScript中的位运算

Huy大约 2 分钟javascriptjavascript

JavaScript 中的位运算

JavaScript 中, 移位运算就是对二进制进行有规律低移位。在本篇中, 将要简要总结 js 位运算 的常用方法及技巧。在 算法中的整除和整乘 常以 位运算 代替 Math 方法,速度确实提升很多。常用的位移运算有三种:

<<     //左移
>>     //带符号右移
>>>    //无符号右移

左移 <<

左移操作符 (<<) 将第一个操作数向左移动指定位数,左边超出的位数将会被清除,右边将会补零。

  • 正、负数相同, 且不区分奇偶: 左移 n 位, 即结果乘以 2 的 n 次方 ;

    /** 正数 */
    2 << 1 // 结果为 4
    ;((3 <<
      (1 - // 结果为 6
        /** 负数 */
        2)) <<
      (1 - // 结果为 -4
        3)) <<
      1 // 结果为 -6
    

带符号右移 >>

右移操作符 (>>) 是将一个操作数按指定移动的位数向右移动,右边移出位被丢弃,左边移出的空位补符号位(最左边那位)。

  • 正、负数相同: 右移 n 位, 相当于整除 n 且 向下取整 , 等同于 Math.floor( Num/(2^n) ) ;

    Tips】若想要得到 整除向上取整 结果, 可以 预先 Num+1( (Num+1) >> n ) 等同于 Math.floor( Num/(2^n) ) ;

// 正数
3 >> 1 // 1
4 >> 1 // 2
;(((5 >>
  (1 - // 2
    // 负数
    3)) >>
  (1 - // -2
    4)) >>
  (1 - // -2
    5)) >>
  1 // -3

Tips】需要注意的是, 负数与正数不同, 向上/向下取整 后结果的大小差异。

无符号右移运算符(>>>)

无符号右移运算符(>>>)(零填充右移)将第一个操作数向右移动指定(二进制)位数。

  • 正数:带符号右移运算符(>>) 无差异。
3 >>> 1 // 1
4 >>> 1 // 2
5 >>> 1 // 2

负数:带符号右移运算符(>>) 差异较大, 直接超出数据大小了。最好不要用 !!!

;((-3 >>>
  (1 - // 2147483646
    4)) >>>
  (1 - // 2147483646
    5)) >>>
  1 // 2147483645

参考文献

Loading...