JavaScript中位运算符的克隆函数列表

List of clone functions for bit operators in JavaScript?

本文关键字:函数 列表 运算符 JavaScript      更新时间:2023-09-26

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来&,但我不确定如何做到这一点

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

一句话:保持所有数字为正以避免1-补的问题似乎是有意义的。

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

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));
}

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