Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで2つのバイナリ文字列(2進数)を加算するプログラムの書き方

この記事では、Javaを使って2つのバイナリ文字列(2進数)を加算する方法を解説します。バイナリ文字列とは、0と1だけで表現される数値の並びのことです。ここでは、繰り上がり(キャリー)を管理しながら各桁を順番に足し合わせていく、基本的なアルゴリズムを紹介します。

入力と出力の例

たとえば、次の2つのバイナリ数値を加算することを考えてみましょう。

入力:

10101
10001

出力:

100110

10進数に直すと「21 + 17 = 38」となり、38を2進数で表現すると「100110」になります。つまり、計算結果が正しいことが確認できます。

アルゴリズム

処理の流れは以下のとおりです。

ステップ1 - 処理を開始する
ステップ2 - Scannerオブジェクトを新しく作成する
ステップ3 - 2つのバイナリ数値を入力として受け取る
ステップ4 - キャリー(繰り上がり)用の変数を定義する
ステップ5 - while文で、どちらかの数値に未処理の桁が残っている間ループを続ける
ステップ6 - %演算子で最下位桁を取り出し、キャリーも含めて加算する
ステップ7 - 計算結果を表示する
ステップ8 - 処理を終了する

加算の仕組み

このプログラムでは、バイナリ数値をlong型の整数として扱い、次の手順で各桁を処理していきます。

  • 最下位桁の取り出し: % 10 演算子を使って、各数値の一番右の桁(ビット)を取得します。
  • その桁の合計: 取り出した2つの桁とキャリーを足し、% 2 を適用することで、その桁の値(0または1)を求めます。
  • 新しいキャリー: 同じ合計値を / 2 することで、次の桁への繰り上がりの有無を判定します。
  • 桁のシフト: / 10 で数値を1桁右へずらし、処理済みの桁を取り除きます。

すべての桁を処理し終えた後、キャリーが残っていればそれを結果に追加します。最後に、配列へ逆順で格納された桁を後ろから順に出力することで、正しい並びの答えが得られます。

例1:ユーザーからの入力を受け付ける場合

この例では、Scannerを使ってユーザーが入力した値をもとに計算を行います。

import java.util.*;
public class AddBinaryNumbers {
   public static void main(String[] args) {
      long binary_input_1, binary_input_2;
      System.out.println("必要なパッケージがインポートされました");
      Scanner input = new Scanner(System.in);
      System.out.println("リーダーオブジェクトが定義されました");
      System.out.print("1つ目のバイナリ数値を入力してください : ");
      binary_input_1 = input.nextLong();
      System.out.print("2つ目のバイナリ数値を入力してください : ");
      binary_input_2 = input.nextLong();
      int i, carry;
      i = 0;
      carry = 0;
      int[] binary_sum = new int[10];
      while (binary_input_1 != 0 || binary_input_2 != 0) {
         binary_sum[i++] = (int) (carry + (binary_input_1 % 10 + binary_input_2 % 10) % 2);
         carry = (int) ((binary_input_1 % 10 + binary_input_2 % 10 + carry) / 2);
         binary_input_1 = binary_input_1 / 10;
         binary_input_2 = binary_input_2 / 10;
      }
      if (carry != 0) {
         binary_sum[i++] = carry;
      }
      --i;
      System.out.print("\nバイナリ数値の合計は : ");
      while (i >= 0) {
         System.out.print(binary_sum[i--]);
      }
      System.out.print("\n");
   }
}

出力:

必要なパッケージがインポートされました
リーダーオブジェクトが定義されました
1つ目のバイナリ数値を入力してください : 10101
2つ目のバイナリ数値を入力してください : 10001
バイナリ数値の合計は : 100110

例2:事前に定義された値を使用する場合

この例では、バイナリ数値があらかじめコード内で定義されており、その値を使って計算と結果の表示を行います。

public class AddingBinaryNumbers {
   public static void main(String[] args) {
      long binary_input_1, binary_input_2;
      binary_input_1 = 10101;
      binary_input_2 = 10001;
      System.out.print("1つ目のバイナリ数値 : " + binary_input_1);
      System.out.print("\n2つ目のバイナリ数値 : " + binary_input_2);
      int i, carry;
      i = 0;
      carry = 0;
      int[] binary_sum = new int[10];
      while (binary_input_1 != 0 || binary_input_2 != 0) {
         binary_sum[i++] = (int) (carry + (binary_input_1 % 10 + binary_input_2 % 10) % 2);
         carry = (int) ((binary_input_1 % 10 + binary_input_2 % 10 + carry) / 2);
         binary_input_1 = binary_input_1 / 10;
         binary_input_2 = binary_input_2 / 10;
      }
      if (carry != 0) {
         binary_sum[i++] = carry;
      }
      --i;
      System.out.print("\nバイナリ数値の合計は : ");
      while (i >= 0) {
         System.out.print(binary_sum[i--]);
      }
      System.out.print("\n");
   }
}

出力:

1つ目のバイナリ数値 : 10101
2つ目のバイナリ数値 : 10001
バイナリ数値の合計は : 100110

まとめ

このように、%演算子と/演算子を組み合わせて各桁を取り出しながら加算していくことで、バイナリ文字列同士の足し算を実現できます。なお、この手法はバイナリ数値をlong型として扱うため、非常に長いバイナリ列を扱う場合には桁あふれ(オーバーフロー)に注意が必要です。そのようなケースでは、文字列として各桁を処理する方法や、BigIntegerクラスを利用するとより安全に実装できます。

  1. C++で2つの2進数文字列を加算するプログラムの書き方

    2つの2進数を表す文字列が与えられたとき、それらを加算した結果を求め、その結果を2進数の文字列として返すことを考えます。2進数とは、0か1のいずれかで表現される数値のことです。2進数同士を足し合わせる際には、以下のような2進数特有の加算ルールに従う必要があります。0+0 → 0 0+1 → 1 1+0 → 1 1+1 → 0(繰り上がり1)入力例str1 = {11}, str2 = {1}出力例100入力例str1 = {110}, str2 = {1}出力例111問題を解くためのアプローチ両方の文字列を末尾(最下位桁)から走査する対応する桁の2進数同士を加算する1と1を足した場合は、その桁

  2. Pythonで2つの数値を加算するプログラム:ビット演算による実装方法

    この記事では、2つの数値を加算するという問題に対する解法とアプローチについて詳しく解説します。 問題の概要 2つの大きな数値が与えられ、それらを加算した結果を出力することが求められます。 最も単純なアプローチは、オペランド同士を「+」演算子で結ぶ方法です。また、2つの数値をリストなどのイテラブルに格納し、Python標準ライブラリに用意されている組み込み関数 sum() を利用する方法もあります。 しかし、これらのアプローチでは10進数に対して直接演算を行うため、計算コストが増大するという課題があります。 ビット演算を用いた別のアプローチ そこで次に、数値をビット単位で操作する別のアプローチを