2017-03-28 19 views
2

私はコンピュータ組織クラスのために異なるプロジェクトで作業していました。私たちはBitWise演算を行っています。私たちの現在の仕事は自​​作の 'rotateLeft'メソッドをJava用に作成することです。32ビット整数のRotateLeft演算

javaはすでにInteger.rotateLeftを使用していますが、現在のタスクではこのプログラムで作業するように書いています。

注:int型の変数は、これらのビット列を等しく

×1 = 3 = 00000000000000000000000000000011
×2 = -11 = 1111111111111111111111111111110101

私の現在のプログラムは次のとおりです。

public class Demo 
{ 
    public static void main(String[]args) 
    { 
     int x1=3, x2=-11; 
     System.out.print("x1:   "); 
     BitWise.printbit(x1); 
     System.out.print("rotateLeft(x1,2): "); 
     BitWise.printbit(rotateLeft(x1,2)); 
     System.out.print("x2:   "); 
     BitWise.printbit(x2); 
     System.out.print("rotateLeft(x2,2): "); 
      BitWise.printbit(rotateLeft(x2,2)); 
     } 
     public static int rotateLeft(int i, int distance) 
     { 
      int mask= i>>distance; 
      return mask; 

      } 
     } 

この操作は、のために働きますしかし、x1ビットパターンはビットをシフトするだけで、実際にはそれらを回転させません。

提案がありますか?

+0

それが回転していないと言うにはどうすればよいですか?予想されるo/pと元の出力の詳細を共有できますか? – MSD

+1

@MSD現在の設定私はビットをシフトするだけです。最初のビット列のために働くでしょう。しかし、私がシフトアウトしている最初の2ビットがもう一方の端でゼロになって以来、2番目のビットではありません。私はビットを回転させてもう一方の端にシフトさせる方法を思いついています –

答えて

2

これは私の作品:

public static void main(String[] args) { 
    int x1 = 3; 
    int x2 = -11; 

    int x1IntegerRotated = Integer.rotateLeft(x1, 2); 
    int x1SelfRotated = rotateLeft(x1, 2); 
    System.out.printf("x1 = %d(%s)%n",    x1,    printIntBitwise(x1)); 
    System.out.printf("x1IntegerRotated = %d(%s)%n", x1IntegerRotated, printIntBitwise(x1IntegerRotated)); 
    System.out.printf("x1SelfRotated = %d(%s)%n", x1SelfRotated, printIntBitwise(x1SelfRotated)); 

    System.out.println(); 

    int x2IntegerRotated = Integer.rotateLeft(x2, 2); 
    int x2SelfRotated = rotateLeft(x2, 2); 
    System.out.printf("x2 = %d(%s)%n",    x2,    printIntBitwise(x2)); 
    System.out.printf("x2IntegerRotated = %d(%s)%n", x2IntegerRotated, printIntBitwise(x2IntegerRotated)); 
    System.out.printf("x2SelfRotated = %d(%s)%n", x2SelfRotated, printIntBitwise(x2SelfRotated)); 
} 

private static int rotateLeft(int value, int distance) { 
    int mask = (1 << distance) - 1; 
    int leftPart = (value << distance) & (~mask); 
    int rightPart = (value >> (32 - distance)) & (mask); 

    int result = leftPart | rightPart; 

    return result; 
} 

private static String printIntBitwise(int a) { 
    StringBuilder sb = new StringBuilder(); 

    for(int i = 1; i <= 32; i++) { 
    sb.append(Math.abs((a & (1 << (32 - i))) >> (32 - i))); 
    } 

    return sb.toString(); 
} 
+0

'>>>'を使うとマスクを外すことができます(左シフトの場合は必要ありません今のどちらか) – harold

1

[OK]を、私はこれを行う方法を考え出した:

//This is a helper function; it returns an int where the leftmost num bits are 1 and the rest are 0 
static int get1s(int num) { 
    int buf = 0; 
    for (int i = 31; i>31-num;i--) { 
     buf += 1 << i; 
    } 
    return buf; 
} 

static int rotateLeft(int i, int distance) { 
    int end = i & get1s(distance); 
    int mov = end >>> 32 - distance; 
    int shift = i << distance; 
    return shift + mov; 
} 

基本的に、これが動作する方法を、行ごとに、次のとおりです。

に等しい endを設定し
  • 最も左のdistanceビットだけをシフトします。

  • endと等しく設定すると、最も右にdistanceビットになります。

  • shiftをシフト値に設定します。

  • 戻り値shiftmovこれにより、一番左のビットが一番右側に配置されます。そう、

    static int rotateLeftWithPrint(int i, int distance) { 
        int end = i & get1s(distance); 
        System.out.println(Integer.toBinaryString(end)); 
        int mov = end >>> 32 - distance; 
        System.out.println(Integer.toBinaryString(mov)); 
        int shift = i << distance; 
        System.out.println(Integer.toBinaryString(shift)); 
    
        System.out.println(Integer.toBinaryString(shift+mov)); 
        return shift + mov; 
    } 
    

    NOTEInteger.toBinaryStringないショー先行ゼロを行います。

あなたは、これは、より詳細にどのように動作するかを確認したい場合は、各ステップの後に結果を印刷することができますそのため、常に同じ長さのStringが印刷されるとは限りません。

EDIT - これは便利かもしれないが、数字の前に0bを置くことでバイナリリテラルを追加することができます。 30b00000000000000000000000000000011に相当します。

関連する問題