【问题标题】:List of clone functions for bit operators in JavaScript?JavaScript中位运算符的克隆函数列表?
【发布时间】:2016-11-25 11:30:45
【问题描述】:

JavaScript 整数可以达到 2^53,但所有位运算只能达到 2^32。有时我需要对 2^32 和 2^53 之间的数字进行位运算,所以我必须为所有位运算编写替代函数:

这是我目前所拥有的:

function lshift(num, bits) {
  return num * Math.pow(2, bits);
}

function rshift(num, bits) {
  return Math.floor(num / Math.pow(2, bits));
}

这是实现移位功能的最佳方式吗?

我现在需要实现&|。在我的代码中,我经常需要通过 127 和 128 来&,但我不知道该怎么做。

我不需要~^,但我猜为了完整起见,它们可以包含在答案中。

【问题讨论】:

标签: javascript math binary bit-manipulation


【解决方案1】:

一般性评论:保持所有数字为正数以避免 1-补码问题似乎是有意义的。

对于 lshift 函数,如果移位不会溢出 32 位,我不确定它是否值得做一些检查,并在这种情况下使用常规移位操作:它可能会减少复杂的操作,但它会还添加检查和分支...

function and(a, b) {
  var low = a & b & 0x7fffffff;
  if (a <= 0x7fffffff || b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) & rshift(b, 31);
  return low + lshift(hi, 31);
}

function or(a, b) {
  var low = (a | b) & 0x7fffffff;
  if (a <= 0x7fffffff && b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) | rshift(b, 31);
  return low + lshift(hi, 31);
}

function xor(a, b) {
  var low = (a ^ b) & 0x7fffffff;
  if (a <= 0x7fffffff && b <= 0x7fffffff) {
    return low;
  }
  var hi = rshift(a, 31) ^ rshift(b, 31);
  return low + lshift(hi, 31);
}

function rshift(num, bits) {
  return num <= 0x7fffffff ? num >> bits : 
      Math.floor(num / Math.pow(2, bits));
}

编辑:修复了或中的一个错误,添加了异或

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-01
    • 2010-12-22
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2020-09-01
    相关资源
    最近更新 更多