【Java】基数変換を行うプログラム

基数変換ってご存じでしょうか?基本情報技術者試験の勉強を始めたら一番最初に立ちはだかる壁が基数変換ではないでしょうか。

今回は、基数変換とは何か?どのように計算するか?について解説したのち、これをプログラムとして実現させるとどうなるのかを考えてみたいと思います。先日はC言語で閏年判定のプログラムを作りました。気になる方はこちらからどうぞ↓

今回はJavaで作ってみたいと思います。その前に、C言語とJavaの違いをサラッと理解しておきましょう。

CとJavaの特徴

プログラミングをある程度勉強している方ならもうお分かりだと思いますが、C言語とJavaにはそれぞれ特徴があります。

C

  • 対応する機器が多様である。一般的なPCはもちろん、自動車などの組み込み用マイコンからスーパーコンピュータまで幅広い。
  • 開発時期が古い(1972年頃)ため、機械語の影響を強く受けた文法構造である(明快ではなく難解)。
  • 手続き型言語である。

手続き型言語とは、コンピューターが行うべき処理を順番に記述していきます。

例えば、カレーライスをコンピュータに作らせる場合を考えてみましょう。

  1. 野菜を切る
  2. 肉を炒める
  3. 野菜を炒める
  4. 水を入れる
  5. しばらく煮込む
  6. ルーを溶かす
  7. 再度煮込む
  8. 完成

一般的に上のような工程でカレーを作ると思います。手続き型言語でプログラムを書く際は、このように、一連の手順を1つ1つの処理を順番に記述していきます。手続き型言語について詳細は↓を参照してみてください。

関連ページ

手続き型言語とは(外部ページ)

Java

  • オブジェクト指向を取り入れているが、手続き型言語としてもプログラミング可能
  • C言語に比べると新しい言語である(1995年)
  • Javaプログラムは、Java実行環境が導入されていればOSに依存することなく動く

オブジェクト指向とは何かと言いますと、データと手続きをオブジェクトと呼ばれる1つのまとまりとして定義して、多数のオブジェクト同士を組み合わせてシステムを構築していく手法です。

オブジェクト指向については、簡潔に説明することが難しいので、参考になりそうなページのリンクを貼っておきます。

関連ページ

基数変換とは

C言語とJavaの特徴について理解できたところで本題に入りましょう。

基数変換とは、ある基数で表した数値を、別の基数表現に置き換えることです。

例えば、2進数から4進数に変換したり、8進数から6進数に変換したり。。。

基数変換の計算方法

〇進数から10進数へ変換する

〇進数の〇の部分には10以外の数が入ります。8進数や16進数など。

この場合の計算は、基数桁の重みを使います。

例:8進数表記の32を10進数に変換する

基数は8です。1桁目の重みは8の0乗、つまり1です。2桁目の重みは8の1乗=8です。

したがって、(1×2)+(3×8)=26

以上より、8進数表記の32を10進数に変換すると26です。

10進数から〇進数へ変換する

先程と逆のパターンです。

桁の重みを使って計算する方法もありますが、割り算を使う方が分かりやすいので、今回は後者の方法を使います。

先程の例の問題を使って、逆の計算(10進数から8進数へ変換)をしてみましょう。

26を基数(今回は8進数に変換するので8)で割ります。商が出たらその商を再度基数で割ります。これを、商が0になるまで繰り返します。そして、余りを下から上へ並べ直します。

26÷8=3…2 ですね。商が3で、余りが2です。

続いて、3÷8=0…3 です。商が0・余りが3です。

商が0になったので割り算は終了です。

余りを下から並べ直すので、32です。23ではないので注意しましょう。

〇進数から〇進数へ変換する

この場合は一度10進数に変換してから、再度変換すれば大丈夫です。

例えば2進数から5進数に変換する場合は、一度2進数から10進数に変換してから、10進数から5進数に変換します。上2つの合体版ですね。

ソースコード

では実際にどのようなプログラムになるのか見てみましょう。あくまで一例です。

/* 基数変換を行うプログラム */

import java.util.Scanner;

class radix {
	
	/* 桁の重みと基数を計算するメソッド */
	static int ruijo (int a, int b) {
		int num = 1;
		for (int i = 0; i < b; i++) {
			num = num * a; 
		}
		return num;
	}

	/*〇進数を10進数に変換するメソッド */
	static int radixA (int a, int b) {	/* 基数をa,入力値をb */
		int num = 0;
		int ruijoAns = 0;
		
		for (int i = 0; b != 0; i++) {
			ruijoAns = ruijo (a, i);
			num = num + b % 10 * ruijoAns;
			b /= 10;
		}
		return num;
	}
	
	/* 10進数を〇進数に変換するメソッド */
	static int radixB (int a, int b) {
		int num = 0;
		int ruijoAns = 0;
		
		for (int i = 0; b != 0; i++) {
			ruijoAns = ruijo (10, i);
			num = num + b % a * ruijoAns;
			b /= a;
		}
		return num;
	}
	
	public static void main (String[] args) {
		Scanner stdIn = new Scanner (System.in);
		
		int numA = 0;	// radixAの戻り値を格納する変数
		int numB = 0;	// radixBの戻り値を格納する変数
		
		System.out.println ("何進数を入力しますか?(2~10)");
		int shinsuA = stdIn.nextInt();
		
		System.out.println ("変換する値を入力してください");
		int nyuryoku = stdIn.nextInt();
		
		System.out.println ("何進数に変換しますか?(2~10)");
		int shinsuB = stdIn.nextInt();
		
		if (shinsuA != 10) {
			numA = radixA (shinsuA, nyuryoku);
		}
		else {
			numA = nyuryoku;
		}
		
		if (shinsuB != 10) {
			numB = radixB (shinsuB, numA);
		}
		else {
			numB = numA;
		}
		
		System.out.println (shinsuA + "進数の" + nyuryoku + "を" + shinsuB +"進数に変換した値は" + numB +"です。");
	}
}

プログラムの主な流れはこんな感じです。

  1. 何進数を入力するかを確認
  2. 変換する値を確認
  3. 何進数に変換するかを確認
  4. 変換前の基数が10進数でなかった場合のみ、メソッドを呼び出して10進数に変換
  5. 変換後の基数が10進数でなかった場合のみ、メソッドを呼び出して〇進数に変換
  6. 結果を画面に出力

メソッドは、桁の重みと基数を掛け合わせるもの、〇進数から10進数に変換するもの、10進数から〇進数に変換するものの3つを作りました。

10進数から10進数に変換するというような時間の無駄でしかないアホみたいな計算を避けるために、if文で基数が10の場合を弾いています。

メソッドとは

プログラムの中で、処理を1つの部品としてまとめたものがメソッドです。

今回の基数変換では、10進数に変換する処理と10進数から変換する処理とその過程で使う桁の重みの計算の処理を、それぞれ独立したメソッドとしてまとめることでプログラムの可読性が上がると考えたので、取り入れました。

最後に

今回は、

  • C言語とJavaの特徴
  • 基数変換の計算方法
  • 基数変換をJavaで実現させた場合のソースコード

について説明しました。ソースコードについては、if文とメソッドとfor文と変数とキーボード入力が理解できていれば読み解けるかと思うので、そんなに難しい内容ではないかと思います。

また、今回は記号などが入力された場合の処理については考慮しておりませんので、ご了承お願いします。

ソースコードの中で不明な点がありましたら、問い合わせフォームからお問い合わせいただければと思います。

それでは今回はここで終わりです。最後までお読みいただき、ありがとうございました。