我有一个按位形式的数字(例如10101111000010 ...),长度为30位。让它成为
abcdefgh.....wxyz
我想要一个漂亮的方式来移动它,所以它保持30位数,但它移动了3,但前三个然后放在底部。
defgh.....wxyzabc
所以一切都向上移动了3,但前三位数字放在右边。
如何巧妙地完成这项工作。
另外我需要反向操作,所以如果我从
开始abcdefgh....wxyz
它改变了另一种方式
xyzabcdefgh....w
这一切都在30位数区域内完成。 30位区域外的所有位保持为0。
这一切都必须用一只眼来看待javascript只能可靠地识别高达52/53位的数字。
到目前为止,我看起来很糟糕:
var digits = 30;
var shift = 3;
var value = 167596277;
var shiftedValue = (value >> shift) | (value & (Math.pow(2, shift)-1)) << (digits - shift);
答案 0 :(得分:0)
感谢您的链接。无论如何,看起来我做得很好。这是我的javascript函数:
// Returns the new number
// This assumes the lowest bit of the number is on the right
// So going left puts the high number bits at the bottom on the right
// So going right puts the lowest bits to the left high number bits
// 'value' is the number you are doing it to
// 'shift' is how many bits you are shifting Minus is left, Plus is right
// 'maxbits' is the max bits in the number
function RotateLeftRight (value, shift, maxbits) {
var doLeft;
var ret, rightShift, leftShift, mask;
if (maxbits <= 0) return 0; // Nothing to do
ret = value & (Math.pow(2, maxbits) - 1); // Mask out the value so it has the correct bits to start with
doLeft = shift < 0 ? true : false;
if(doLeft) shift = -shift;
shift %= maxbits;
if(shift === 0) return ret;
if (doLeft) {
rightShift = maxbits - shift;
leftShift = shift;
mask = Math.pow(2, maxbits - shift) - 1;
} else {
rightShift = shift;
leftShift = maxbits - shift;
mask = Math.pow(2, shift) - 1;
}
return ((ret >> rightShift) | ((ret & mask) << leftShift));
};
我会将此标记为答案,除非有人想再输入。