1

私は、decimalInput という名前の整数 (現在はテスト目的のリテラル) を取り、バイナリ形式の 10 進数である binaryOutput という文字列に変換するプログラムを作成しています。このガイド (最初のガイド)を使用して、10 進数から 2 進数への変換がどのように行われるかを説明します。これまでの私のコードは次のとおりです。

public class ToBin {
public static void main(String[] args) {
    int decimalInput = 19070;
    String binaryOutput = "";
    while (decimalInput > 0) {
        if (decimalInput % 2 == 0) {
            binaryOutput = "0" + binaryOutput;
            decimalInput = decimalInput / 2;
        }
        else {
            binaryOutput = "1" + binaryOutput;
            decimalInput = decimalInput / 2;
        }
    }
    System.out.println(binaryOutput);
    }
}

私が持っている現在のリテラル (19070) の場合、プログラムは文字列 "100101001111110" を返します。ただし、これは正しくありません。私のプログラムは「10010100111」を返す必要があります。そのため、何らかの理由で、私のプログラムは末尾に「1110」という余分な文字列を追加しました。最初は、どこかで数学を間違えたのではないかと思いました。というわけで計算してみたところ、問題ないようでした。次に、リテラルの decimalInput をより小さな数値、具体的には 156 に変更してみました。これは、適切な出力である文字列 "10011100" を返します。

decimalInput を long 型に変更して、それが役立つかどうかを確認しようとしましたが、そうではありませんでした。

私が知っているのは、何らかの理由で、より大きな数が私のプログラムを狂わせているということだけです. 理由はわかりません。

これは本当にイライラするので、助けていただければ幸いです。これもクラス用なので、toBinaryString()を使いたいのですが、できません。

ありがとう!

4

2 に答える 2

4

toBinaryString を使用して結果をすべて同じようにチェックします

int decimalInput = 19070;
System.out.println(Integer.toBinaryString(decimalInput));

版画

100101001111110

あなたのプログラムと同じように、その正しいです!

注: プログラムは負の数をまったく表示しません。

于 2012-09-21T07:02:09.353 に答える
1

2番目の質問の答え

「負の数を処理するようにプログラムを修正する方法を考えてもらえますか?」

他のコメントで提案したように、ビット シフト演算子を使用します。

if ステートメントは次のようになります。

if (decimalInput & 0x01 == 0) { // If the least significant bit is set

そして、「分割」は次のようになります。

decimalInput = decimalInput >>> 1; // Shifting all bits one to the right

これは、何が起こっているのかを理解するのに役立ちます:

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

于 2012-09-21T08:18:56.437 に答える