1. 序章

2進数システムは、0と1を使用して数値を表します。 コンピューターは2進数を使用して、任意のデータを格納および操作します。

このチュートリアルでは、2進数を10進数に、またはその逆に変換する方法を学習します。 また、それらに足し算と引き算を行います。

2. バイナリリテラル

Java7はバイナリリテラルを導入しました。 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. 10進数から2進数

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. n を2で割り、商qと余りrに注意してください。
  2. q を2で割り、その商と余りに注意してください
  3. 商として0が得られるまで、手順2を繰り返します。
  4. 残りのすべてを逆の順序で連結します

6を同等のバイナリ形式に変換する例を見てみましょう。

  1. まず、6を2で割ります。商3、余り0
  2. 次に、3を2で割ります。商1、余り1
  3. そして最後に、1を2で割ります。商0、余り1
  4. 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. 2進数から10進数

バイナリ文字列を解析するために、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進数に変換する独自のロジックを作成してみましょう。

  1. 右端の数字から始めます
  2. 各桁にその桁の2^{position}を掛けます–ここでは、右端の桁の位置はゼロであり、左側に移動すると増加します
  3. すべての乗算の結果を加算して、最終的な10進数を取得します

繰り返しになりますが、実際のメソッドを見てみましょう。

  1. まず、101011 =(1 * 2 ^ 5)+(0 * 2 ^ 4)+(1 * 2 ^ 3)+(0 * 2 ^ 2)+(1 * 2 ^ 1)+(1 * 2 ^ 0 )。
  2. 次に、101011 =(1 * 32)+(0 * 16)+(1 * 8)+(0 * 4)+(1 * 2)+(1 * 1)
  3. 次に、101011 = 32 + 0 + 8 + 0 + 2 + 1
  4. そして最後に、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桁を追加するときは、次の規則を覚えておく必要があります。

  • 0 + 0 = 0
  • 0 + 1 = 1
  • 1 + 1 = 10 
  • 1 + 1 + 1 = 11 

これらのルールは次のように実装できます。

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. 減数sの1の補数を計算します
  2. sと被減数を追加します
  3. ステップ2でキャリーが生成された場合は、そのキャリーをステップ2の結果に追加して、最終的な答えを取得します。
  4. ステップ2でキャリーが生成されない場合、ステップ2の結果の1の補数が最終的な答えになります。 しかし、この場合、答えは否定的です

上記の手順を実装しましょう。

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進数の加算や減算などの算術演算を実行しました。

この記事で使用されている完全なコードは、GitHubから入手できます。