Java初心者の競技プログラミング日記

Dvorak配列でjavaを書いてます

Javaで基数変換(10進数からn進数、n進数から10進数)

yukicoderの[No.499 7進数変換]を解いていて、10進数で与えられる数値を7進数に変換する必要があったので、自分は数値を7で割りながらその余りを求めていく方法で解いた。以下がその僕の回答だ。
#236582 No.499 7進数変換 - yukicoder

しかし調べていくと、はるかに簡単な求め方があったようなのでそれを紹介する。

import java.util.*;

public class Main {
	static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		//【10進数→n進数】
		
		//10進数30を16進数に変換
		String s_16 = Integer.toString(30,16);
		
		//10進数100を7進数に変換
		int i_7 = Integer.parseInt(Integer.toString(100,7));
		
		//出力
		System.out.println(s_16); //output = 1e
		System.out.println(i_7); //output = 202
		
		
		
		//【n進数→10進数】
		
		//16進数1eを10進数に変換
		int i1 = Integer.parseInt("1e",16);
		
		//7進数202を10進数に変換
		int i2 = Integer.parseInt("202",7);
		
		//出力
		System.out.println(i1); //output = 30
		System.out.println(i2); //output = 100
		
		
		
		//【n進数→m進数】
		int n = 2;
		int m = 8;
		String s = Integer.toString(Integer.parseInt("1110",n),m);
		
		//出力
		System.out.println(s); //output = 16
		


		//【基数の下限と上限】
		System.out.println(Character.MIN_RADIX); //output = 2
		System.out.println(Character.MAX_RADIX); //output = 36
	}
}


・String sn = Integer.toString(i,n);
 →「10進数(i)」を「n進数(sn)」に変換する

・int i = Integer.parseInt("sn",n);
 →「n進数(sn)」を「10進数(i)」に変換する

・String sm = Integer.toString(Integer.parseInt("sn",n),m);
 →「n進数(sn)」を「m進数(sm)」に変換する

・String sm = Long.toString(Long.parseLong("sn",n),m);
 →変換後の値がint型の範囲を超える場合はこっち


これを使うさいの注意点について。

①基数が11以上の進数に変換する場合、戻り値にアルファベットが含まれるので、必ずString型で受け取るようにする。

②基数が10以下の進数に変換する場合は、int型でも受け取ることができる。ただし、Integer.toString()は文字列を返すので、Integer.parseInt()を使ってint型に変換してから受け取る。また、基数が大きいものから小さいものに変換すると、もとの値よりも桁数が増えるので、値によってはLong.parseLong()を使ってlong型で受け取ったほうがいいと思われる。例えば、10進数1000000000を4進数に変換すると323212230220000となり、int型では桁あふれを起こしてしまうので、long型で受け取る。

③基数に設定できるのはCharacter.MIN_RADIXからCharacter.MAX_RADIXまで、2~36となっている。

④10進数から2、8、16進数への変換については、それぞれ専用のメソッドが用意されているようなので、そちらを使ったほうが速いかもしれない。
・String bin = Integer.toBinaryString(i); 10進数i → 2進数bin
・String oct = Integer.toOctalString(i); 10進数i→8進数oct
・String hex = Integer.toHexString(i); 10進数i→16進数hex


記事を書くにあたって、こちらの回答と記事を参考にさせていただきました。
#164033 No.499 7進数変換 - yukicoder
Javaで進数変換を行う方法 - Qiita