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