2017-11-09 12 views
2

ビット演算子で遊びたいと思っていました。具体的には、循環的なビット単位のシフトを行いたいと思っていました。だから私はJavaでこの例を試してみたときに、私は数101は、それが1つのステップを左シフトすると、今すぐ011になるはずであるしていると言う、それはちょうどこのように、ゼロの束を示していますJavaビットの循環シフトが機能しない

//Circular right shift 
private static void testCircular() { 
    int x = 37; 
    System.out.println(x + " Is " + Integer.toBinaryString(x)); 

    x = (x >>> 8) | (x << (Integer.SIZE - 8)); 

    System.out.println(x + " Is " + Integer.toBinaryString(x)); 
} 

これは私に与えます次の結果:

37 Is 100101 
620756992 Is 100101000000000000000000000000 

ご覧のとおり、何も移動していないことがわかります。私もstate = Integer.rotateRight(state,8);メソッドを試しました、それは同じことをします。私はここで何が欠けていますか?

答えて

2

私はそれが期待どおりに動作すると思います。欠けているのはビット数で完全に表現されています。最初にゼロをスキップして印刷します。整数は32ビットに格納されているので、完全な表現は次のようになります。

int x = 37; 
00000000000000000000000000100101 

x = (x >>> 8) | (x << (Integer.SIZE - 8)); 
00100101000000000000000000000000 

EDITここ

整数の完全な文字列表現を取得するためのメソッドです:

public static String toBinaryStringWithLeadingZeros(int x) { 
    StringBuffer buf = new StringBuffer(32); 
    char[] arr = new char[Integer.numberOfLeadingZeros(x)]; 
    Arrays.fill(arr, '0'); 
    buf.append(arr); 
    buf.append(Integer.toBinaryString(x)); 
    return buf.toString(); 
} 
+0

これは間違いなく正しい答えです。それをテストする簡単な方法はシフト '37'で32回で、元の '37'が得られます。 – kkflf

+0

私は、バイナリ文字列がすべてのゼロを出力しないということを少し誤解しているのではないでしょうか? – kadde23

+0

私の味については誤解を招く恐れがあります。完全な表現は印刷できますが、見つからない場合もあります。 – kaos

0

あなたコードとInteger.rotateRight(state,8);は同じ結果を返し、期待どおりに動作します。あなたはそれを回転させ、右8回シフトすると

00000000000000000000000000100101 

は、あなたが得る::

00100101000000000000000000000000 
が 何を参照してくださいので、先行ゼロ

Integer.toBinaryString(x))破棄は、最初のケースで100101であるJavaでintはとても100101実際には4バイトであります2番目(最初の2つの0は破棄されます)の100101000000000000000000000000

関連する問題