2016-05-13 3 views
0

BitSetを使用してJavaでラップアラウンドして左シフトを実行する方法を試行していますが、ラップアラウンドを行う方法を理解できません。今私の方法は、最初のビットを削除し、その最初のビットを最後に追加することなく残りを保持します。BitSet LeftShiftラップアラウンドの問題

public static BitSet leftShift(int amount, BitSet b){ 
    BitSet bit2 = new BitSet(b.length()); 

    for(int i = b.length(); i > 0; i--){ 
     bit2.set((i-amount)%b.length(), b.get(i)); 
    } 
    return bit2; 
} 
+0

あなたがより重要か、下位ビットにシフト意味ですか?あなたのコードは、それほど重要でない方向へシフトしようとしているように見えますが、通常は右シフトと呼ばれます。 – Misha

+0

下位ビットにシフトします。したがって、11011は10111になり、左に1シフトします。 – user3614496

答えて

2

コードに2つの問題があります。

  1. ループ境界に1つずつエラーがあります。 BitSetインデックスはゼロベースです。したがって、b.length() - 1から始まり、i >= 0以上にカウントしてください。それ以上の場合は通常通りにしないでください。通常は実行してください。for (int i = 0; i < b.length(); i++)
  2. インデックス計算では、負の数値でラップアラウンドしません。それを修正する簡単な方法は、剰余前b.length()を追加することです:それはバグではありませんしながら、(i + b.length() - amount) % b.length()

最後に、BitSetを反復処理する通常の方法ではなく、すべてのインデックスを超える行くよりもnextSetBitを使用することです。まとめると

、それは次のようになります:「左シフト」によって、

BitSet result = new BitSet(b.length()); 

for (int i = b.nextSetBit(0); i != -1; i = b.nextSetBit(i + 1)) { 
    int j = (i + b.length() - amount) % b.length(); // new index after wrapping 
    result.set(j); 
} 
return result; 
+0

さて、私はあなたが私に与えたことを試してみました。それはC1のための正しい左シフトを与えますが、D1の正しいシフトは与えません。 – user3614496

+0

C:1111000011001100101010101111 D:0101010101100110011110001111 C1:1110000110011001010101011111 D1:101010101100110011110001111 – user3614496

+0

b.nextSetBit(0)であると思われます。最初のビットは1ではないためD1で失敗し、したがって完全にスキップします。 – user3614496

関連する問題