2016-09-26 7 views
0

ビット単位の数値(例:10101111000010 ...)、30桁の長さです。私はそれが30桁のままので、それを周りにシフトする巧みな方法をしたいが、それは3シフトしているが、トップ3は、その後、下部に置かれ、それはビット単位でのシフト

abcdefgh.....wxyz 

とします。

defgh.....wxyzabc 

すべてが3つ上にシフトされますが、上位3桁は右に置かれます。

どのようにこれをきれいに行うことができますか。

はまた、私は逆の操作を必要とするので、私は

abcdefgh....wxyz 

で始まる場合には、これは、すべての30桁のエリアで行われている他の方法

xyzabcdefgh....w 

をシフトします。 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

言語に応じて「バレル/サーキュラーシフター」を作成しようとしていますが、これは重複している可能性があります* C++:* http://stackoverflow.com/questions/25799215/bitwise-rotation-circular-shiftと別のhttp ://stackoverflow.com/questions/776508/best-practices-for-circular-shift-rotate-operations-in-c * java * http://stackoverflow.com/questions/5844084/java-circular-shift-using -bitwise-operations * javascript * http://codereview.stackexchange.com/questions/41006/rotating-array-members – andrew

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

これ以上の入力を希望しない限り、私はこれを答えとしてマークします。

+1

このコードは不必要に複雑に思われます – harold

+0

代替それはすべて上記を行います。 – Rewind