Javaの2進数

1. 前書き

2進数システムでは、0と1を使用して数値を表します。 コンピューターは2進数を使用して、データの保存と操作を行います。
このチュートリアルでは、バイナリを10進数に、またはその逆に変換する方法を学習します。 また、それらに対して加算と減算を実行します。

2. バイナリリテラル

Java 7はバイナリリテラルを導入しました。 2進数の使用を簡素化しました。
それを使用するには、番号の前に0Bまたは0bを付ける必要があります。
@Test
public void given_binaryLiteral_thenReturnDecimalValue() {

    byte five = 0b101;
    assertEquals((byte) 5, five);

    short three = 0b11;
    assertEquals((short) 3, three);

    int nine = 0B1001;
    assertEquals(9, nine);

    long twentyNine = 0B11101;
    assertEquals(29, twentyNine);

    int minusThirtySeven = -0B100101;
    assertEquals(-37, minusThirtySeven);

}

3. 2進数の変換

このセクションでは、2進数を10進数形式に、またはその逆に変換する方法を学習します。 ここでは、最初に変換に組み込みのJava関数を使用し、次にそのためのカスタムメソッドを記述します。

3.1. 2進数の10進数

_Integer_には、__ toBinaryString __という名前の関数があり、10進数をそのバイナリ文字列に変換します。
@Test
public void given_decimalNumber_then_convertToBinaryNumber() {
    assertEquals("1000", Integer.toBinaryString(8));
    assertEquals("10100", Integer.toBinaryString(20));
}
これで、この変換用の独自のロジックを作成できます。 コードを書く前に、まず10進数を2進数に変換する方法を理解しましょう。
10進数_n_をバイナリ形式に変換するには、以下を行う必要があります。
  1. 商_q_と剰余_r_に注目して、__ n_を2で除算します。

  2. _q_を2で除算し、商と剰余に注目します

  3. 商が0になるまでステップ2を繰り返します

  4. すべての剰余を逆順に連結する

    6を同等のバイナリ形式に変換する例を見てみましょう。
  5. まず、6を2で割る:商3、剰余0

  6. 次に、3を2で割る:商1、余り1

  7. そして最後に、1を2で割る:商0、余り1

  8. 110

    上記のアルゴリズムを実装しましょう:
public Integer convertDecimalToBinary(Integer decimalNumber) {

    if (decimalNumber == 0) {
        return decimalNumber;
    }

    StringBuilder binaryNumber = new StringBuilder();
    Integer quotient = decimalNumber;

    while (quotient > 0) {
        int remainder = quotient % 2;
        binaryNumber.append(remainder);
        quotient /= 2;
    }

    binaryNumber = binaryNumber.reverse();
    return Integer.valueOf(binaryNumber.toString());
}

3.2. 10進数の2進数

バイナリ文字列を解析するために、_Integer_クラスは_parseInt_関数を提供します:
@Test
public void given_binaryNumber_then_ConvertToDecimalNumber() {
    assertEquals(8, Integer.parseInt("1000", 2));
    assertEquals(20, Integer.parseInt("10100", 2));
}
ここで、_parseInt_関数は2つのパラメーターを入力として受け取ります。
  1. 変換されるバイナリ文字列

  2. 入力文字列がなければならない基数または数値システムの基数
    変換された

    それでは、2進数を10進数に変換する独自のロジックを作成してみましょう。
  3. 右端の数字から開始

  4. 各桁にその桁の2 ^ \ {位置}を掛けます。ここでは、右端
    桁の位置はゼロであり、左側に移動すると増加します

  5. すべての乗算の結果を加算して、最終小数を取得します

    繰り返しますが、実際のメソッドを見てみましょう。
  6. まず、101011 =(1 * 2 ^ 5)(0 * 2 ^ 4)(1 * 2 ^ 3)(0 * 2 ^ 2)(1 * 2 ^ 1)
    (1 * 2 ^ 0)

  7. 次に、101011 =(1 * 32)(0 * 16)(1 * 8)(0 * 4)(1 * 2)(1 * 1)

  8. 次に、101011 = 32 0 8 0 2 1

  9. そして最後に、101011 = 43

    最後に、上記の手順をコーディングしましょう。
public Integer convertBinaryToDecimal(Integer binaryNumber) {

    Integer decimalNumber = 0;
    Integer base = 1;

    while (binaryNumber > 0) {
        int lastDigit = binaryNumber % 10;
        binaryNumber = binaryNumber / 10;
        decimalNumber += lastDigit * base;
        base = base * 2;
    }
    return decimalNumber;
}

4. 算術演算

このセクションでは、2進数の算術演算の実行に集中します。

4.1. 添加

10進数の加算と同様に、右端の桁から数値の加算を開始します。
2つの2進数を追加するとき、次の規則を覚えておく必要があります。

*
*
*
*

これらのルールは次のように実装できます。
public Integer addBinaryNumber(Integer firstNum, Integer secondNum) {
    StringBuilder output = new StringBuilder();
    int carry = 0;
    int temp;
    while (firstNum != 0 || secondNum != 0) {
        temp = (firstNum % 10 + secondNum % 10 + carry) % 2;
        output.append(temp);

        carry = (firstNum % 10 + secondNum % 10 + carry) / 2;
        firstNum = firstNum / 10;
        secondNum = secondNum / 10;
    }
    if (carry != 0) {
        output.append(carry);
    }
    return Integer.valueOf(output.reverse().toString());
}

4.2. 引き算

2進数を減算する方法は多数あります。 このセクションでは、減算を行うための1の補数法を学習します。
まず、数の補数が何であるかを理解しましょう。
数値の補数は、2進数の各桁を*否定することによって得られる数値です。 つまり、1を0に、0を1 *に置き換えるだけです。
public Integer getOnesComplement(Integer num) {
    StringBuilder onesComplement = new StringBuilder();
    while (num > 0) {
        int lastDigit = num % 10;
        if (lastDigit == 0) {
            onesComplement.append(1);
        } else {
            onesComplement.append(0);
        }
        num = num / 10;
    }
    return Integer.valueOf(onesComplement.reverse().toString());
}
1の補数を使用して2つの2進数の減算を行うには、以下を行う必要があります。
  1. 減数の1の補数を計算します_s_

  2. _s_と被減数を加算します

  3. ステップ2でキャリーが生成される場合、そのキャリーをステップ2に追加します
    最終的な答えを得るための結果。

  4. ステップ2でキャリーが生成されない場合、1の補数
    ステップ2の結果が最終的な答えです。 しかし、この場合、答えは否定的です

    上記の手順を実装しましょう。
public Integer substractBinaryNumber(Integer firstNum, Integer secondNum) {
    int onesComplement = Integer.valueOf(getOnesComplement(secondNum));
    StringBuilder output = new StringBuilder();
    int carry = 0;
    int temp;
    while (firstNum != 0 || onesComplement != 0) {
        temp = (firstNum % 10 + onesComplement % 10 + carry) % 2;
        output.append(temp);
        carry = (firstNum % 10 + onesComplement % 10 + carry) / 2;

        firstNum = firstNum / 10;
        onesComplement = onesComplement / 10;
    }
    String additionOfFirstNumAndOnesComplement = output.reverse().toString();
    if (carry == 1) {
        return addBinaryNumber(Integer.valueOf(additionOfFirstNumAndOnesComplement), carry);
    } else {
        return getOnesComplement(Integer.valueOf(additionOfFirstNumAndOnesComplement));
    }
}

5. 結論

この記事では、2進数を10進数に、またはその逆に変換する方法を学びました。 次に、2進数の加算や減算などの算術演算を実行しました。
この記事で使用される完全なコードは、https://github.com/eugenp/tutorials/tree/master/java-numbers-2 [GitHub]で入手できます。