このページをはてなブックマークに追加このページを含むはてなブックマーク このページをlivedoor クリップに追加このページを含むlivedoor クリップ
*目次 [#j041f5e9]

#contents


*10進数を2進数に変換する [#t22ee616]

 まず偶数なら、2進数の一番下の桁が0になる。また、奇数なら1になる。これは2で割った余りなので当然である。次の桁を求めるには、その桁が一番下の桁になるようにすればよいのだから、元の数を2で割る。整数で計算するので、小数点以下は切り捨てる。その結果が奇数なら1、偶数なら0になる。割った結果が0になるまで、次々に2で割って奇数か偶数かで1か0を左(一番上の桁)から加えていく。

**10進数を2進数に変換するアルゴリズム [#w0fb9a6a]

 10進数を2進数に変換するアルゴリズムは次の通りである。

-Input:A(10進数の整数)
-Output:B(Aを2進数に変換した結果)

#code(){{
while A≧1 do
	rem←A%2
	if rem==1 then
		Bの一番上の桁に1を追加
	else
		Bの一番上の桁に0を追加
	A←A/2
return B

}}

***Javaによる実装 [#z291b19c]

#code(java){{
/*
 * 入力:10進数
 * 出力:変換した2進数
 */
public class Dec2Bin {

	public static void main(String[] args) {
		int dec = 0;		//10進数
		String numstr = "";	//変換後の文字列
		
		//第1引数に10進数を指定する
		if(args.length != 1){
			System.out.println("10進数を2進数に変換します。");
			System.out.println("書式:Dec2Bin <10進数の値>");
			return;
		}
		try{
			dec = Integer.parseInt(args[0]);
		}catch(NumberFormatException e){
			System.out.println("10進数を入力してください。");
			return;
		}
		
		int d=dec;
		
		//10進数が1以上である間繰り返す
		while(d>1){
			//1番下の桁を求める
			int rem = d%2;	//2で割った余りを求める
			
			//その数字を一番上の桁に追加する
			if(rem == 1){
				numstr = "1" + numstr;
			}else{
				numstr = "0" + numstr;
			}
			
			//次の桁の計算のために基数(=2)で割る
			d = d/2;
			
			//現在の値を表示する
			System.out.println("rem=" + rem + "\td=" + d + "\tnumstr=" + numstr);
		}
		System.out.println("10進数" + dec + "は2進数で" + numstr + "である。");
	}
}

}}

例:165という10進数を上記のプログラムの第1引数に指定して実行した結果

 rem=1	d=82	numstr=1
 rem=0	d=41	numstr=01
 rem=1	d=20	numstr=101
 rem=0	d=10	numstr=0101
 rem=0	d=5	numstr=00101
 rem=1	d=2	numstr=100101
 rem=0	d=1	numstr=0100101
 10進数165は2進数で0100101である。

**10進数をn進数に変換するアルゴリズム [#d5d30a9f]

 10進数をn進数に変換するアルゴリズムは次の通りである。

-Input:A(10進数の整数),N(基数。ただし、1≦N≦16の整数)
-Output:B(Aを2進数に変換した結果)

#code(){{
while A≧1 do
	rem←A%N
	if rem==0 then
		Bの一番上の桁に0を追加
	else if rem==1 then
		Bの一番上の桁に1を追加
	else if rem==2 then
		Bの一番上の桁に2を追加
	else if rem==3 then
		Bの一番上の桁に3を追加
	else if rem==4 then
		Bの一番上の桁に4を追加
	else if rem==5 then
		Bの一番上の桁に5を追加
	else if rem==6 then
		Bの一番上の桁に6を追加
	else if rem==7 then
		Bの一番上の桁に7を追加
	else if rem==8 then
		Bの一番上の桁に8を追加
	else if rem==9 then
		Bの一番上の桁に9を追加
	else if rem==10 then
		Bの一番上の桁にAを追加
	else if rem==11 then
		Bの一番上の桁にBを追加
	else if rem==12 then
		Bの一番上の桁にCを追加
	else if rem==13 then
		Bの一番上の桁にDを追加
	else if rem==14 then
		Bの一番上の桁にEを追加
	else
		Bの一番上の桁にFを追加
	A←A/N
return B

}}

 if文とelse if文の条件は余り(rem)を0からチェックしていった方が、トータルのチェック数が少ない。Nの基数に10を入力したときには、rem==10以降をなるべくチェックしないほうが効率よいからである。

 アルゴリズム自体は上記で問題ないが、if文とelse if文が少しエレガントでない。プログラムにするときには、switch文を使って書いた方がすっきりする。

*2進数を10進数に変換する [#d875173d]

**2進数を10進数に変換するアルゴリズム [#e4d2ff9b]

 2進数の文字列を左から処理する方法と、右から処理する方法が考えられる。ここでは左(一番上の桁)から計算していく方法を解説する。求める10進数を0にしておき、その桁の数を足す。次の桁に行く前に、一桁上がるので2倍する。

 2進数を10進数に変換するアルゴリズムは次の通りである。

-Input:A(2進数の整数)
-Output:B(Aを10進数に変換した結果)

#code(){{
for i=0,…,length(A) do
	B←B*2
	if (Aの上からi番目の数値)==1 then
		B←B+1;
return B

}}

***Javaによる実装 [#s62af86b]

#code(java){{
/*
 * 入力:2進数
 * 出力:変換した10進数
 */
public class Bin2Dec {

	public static void main(String[] args) {
		int dec=0;	//10進数
		
		//コマンドラインから入力した2進数を取得する
		if(args.length != 1){
			System.out.println("2進数を10進数に変換します。");
			System.out.println("書式:Bin2Dec <2進数の値>");
			return;
		}
		String numstr=args[0];
		
		//文字列の最後まで繰り返す
		for(int i=0;i<numstr.length();i++){
			dec=dec*2;
			
			//その位置の文字が1なら、10進数に1を足す
			if(numstr.charAt(i) == '1'){
				dec+=1;
			}else if(numstr.charAt(i) != '0'){
				//1と0以外ならエラー
				System.out.println("2進数ではありません。");
				return;
			}
			
			//途中結果を表示する
			System.out.println(i + "番目の数字:" + numstr.charAt(i) + "\t dec=" + dec);
		}
		
		//結果を表示する
		System.out.println("2進数" + numstr + "は10進数で" + dec + "です。");
	}
}

}}


*参考文献 [#ta9822aa]

-『Eclipseによる体験学習 Javaではじめるアルゴリズム入門』