2016-11-12 5 views
1

数字のバイナリコードを提供したいと思います。次のコードは実際には "バイナリコード"を提供しますが、間違った順序で実行します。たとえば、バイナリコード1を印刷したい場合、 "00000001"の代わりに "10000000"を出力します。私は2で任意の数を掛けることは、バイナリコードを左にシフトすることを認識しました。たとえば、数字5はバイナリコード "00000101"を持ち、数字10はバイナリコード "00001010"を持ちます。私はこの仕組みを使うことを考えましたが、私は正しい考えには達していません。バイナリコードが間違った順序で - 正しくシフトするには?

for (int j = 0; j <= 7; j++) { 

if (x % 2 == 0) { 
    IO.print(0); 
} 
else { 
    IO.print(1); 
    x = x/2; 
} 
} 

答えて

1
for (int j = 7; j >= 0; --j) { 
    if ((x & (1 << j)) != 0) { 
     IO.print("1"); 
    } else { 
     IO.print("0"); 
    } 
} 

あなたがチェックしているもの以外のすべてのビットをマスクすることができます(&を使用して)ビット単位とを行うことによって。

ビット0のみが1(1)に設定された数値をシフトして、「マスク」を生成します。あなたがa & bを行うと

式の結果は、それがab両方で1たすべての位置に1ビットを持っています。

+0

私は彼がそれを使うことができないのではないかと心配しています:p – xenteros

+0

ライブラリを使用できず、プリミティブで計算することができない場合は、まったくそれを行うことはできません。 – doug65536

+0

私はプリミティブでしかアルゴリズムを見つけられませんでしたが、私は彼がどの大学に加入しているのか知りたいです。私は教授のチェアを申請したいと思います。 – xenteros

2

まあ、2通りの方法があります。最初の1:

System.out.println(Integer.toBinaryString(x)); 

秒:

StringBuilder sb = new StringBuilder(); 
while (x > 0) { 
    sb.append(x%2); 
    x = x/2; 
} 
sb.reverse(); 
System.out.println(sb.toString()); 

OK、私はStringBuilderをご紹介しましょう。これは、効率的に追加するクラスですStringは、toString()メソッドでいつでも返すことができます。追加はappend()で行われ、任意のプリミティブを引数として取ることができ、Stringも可能です。

上記のコードは言う:

  1. が新しいStringBuilderを作成します。
  2. 数値がまだ0より大きい場合は、String x%2を追加します。
  3. Stringは、現在のソリューションとまったく同じであるため、これを元に戻す必要があります。また、StringBuilderによって提供されています。
  4. 作成したばかりの文字列であるsb.toString()を単に印刷してください。

数字が最大8ビットであると仮定していることがわかります。その場合は、StringBufferchar[8]に置き換えて記入してから、逆に読むことができます。

char[] buff = new char[8]; 
for (int j = 0; j <= 7; j++) { 
    buff[j] = x%2; 
    x=x/2; 
} 

boolean onePrinted = false; 
for (int j = 7; j>=0; j--) { 
    if (onePrinted) { 
     IO.print(buff[j]); 
    } else if (buff[j] == 1) { 
     IO.print(buff[j]); 
     onePrinted = true; 
    } 
} 
if (!onePrinted) { 
    IO.print(0); 
} 

OK、OPの特別なリクエストに対しては、より簡単な方法です。

int countZeros = 0; 
while (x%2 == 0) { 
    x = x/2; 
    countZeros++; 
} 
int temp = 0; 
while (x>0) { 
    temp = temp*2; 
    temp += x%2; 
    x = x/2; 
} 
while (temp > 0) { 
    System.out.print(temp%2); 
    temp = temp/2; 
} 
for (int i = 0; i < countZeros; i++) { 
    System.out.print(0); 
} 
+0

私たちは大学でこれらの方法をまだ紹介していません。 – Julian

+0

forループとwhileループ、およびif-else-conditionalsを使用してのみ行う方法が必要です。 – Julian

+2

それを使用し始めるのはすばらしい瞬間です!私は強くあなたが大学であなたに伝えるより多くを学ぶことを強くお勧めします!さもなければ、あなたは困ってしまうでしょう。 – xenteros

関連する問題