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函数,我不确定如果移位不会溢出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));
}


编辑:修正了或中的错误,并添加了xor

07-26 04:31