按位 - 转换

时间:2016-09-26 22:02:27

标签: bit-manipulation

我有一个按位形式的数字(例如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);

1 个答案:

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

我会将此标记为答案,除非有人想再输入。