基数表記とはいわゆる2進数表記とか16進数表記とか10進数以外の表記のことを言います。intなどの数値を基数表記する方法と、文字列で与えられた基数表現をintなどに変換する方法を紹介します。(ここで言う基数は2〜36と想定しています。)
まずはint等の数字を基数として文字列に変換する方法です。それにはIntegerクラスのstaticメソッドのtoString()メソッドを用います。これは引数のないメソッドはstatic出はないメソッドでオブジェクトの内容を10進数で表記します。引数を1つとるstaticメソッドではその引数を10進数表記で返します。ここで使うのは引数を2つとるメソッドです。1つめの引数は変換する数値を、2つめの引数は基数を指定します。
public class Test {
public static void main(String args[]) {
System.out.println(Integer.toString(100, 16));
System.out.println(Integer.toString(100, 32));
System.out.println(Integer.toString(-100, 16));
}
}
|
C:\java>java Test
64
34
-64
C:\java>
|
じつは、2進数、8進数、16進数はよく使うため、それぞれtoBinaryString(int i)、toOctalString(int i)、toHexString(int i)というメソッドが用意されています。ただし、負数に対する振る舞いが違います。toHexStringなどを用いた場合は2の補数として表記されます。
public class Test {
public static void main(String args[]) {
System.out.println(Integer.toString(100, 16));
System.out.println(Integer.toHexString(100));
System.out.println(Integer.toString(-100, 16));
System.out.println(Integer.toHexString(-100));
System.out.println();
System.out.println(Integer.toString(100, 8));
System.out.println(Integer.toOctalString(100));
System.out.println(Integer.toString(-100, 8));
System.out.println(Integer.toOctalString(-100));
System.out.println();
System.out.println(Integer.toString(100, 2));
System.out.println(Integer.toBinaryString(100));
System.out.println(Integer.toString(-100, 2));
System.out.println(Integer.toBinaryString(-100));
}
}
|
C:\java>java Test
64
64
-64
ffffff9c
144
144
-144
37777777634
1100100
1100100
-1100100
11111111111111111111111110011100
C:\java>
|
上記の例のようにアルファベットは小文字が使われますので、必要によってStringクラスのtoUpperCaseメソッドを用いて大文字に変換します。
次に、文字列から数値に変換する方法を紹介します。これも同じくIntegerクラスのstaticメソッドのparseInt()メソッドを用います。Stringクラスの引数を1つとるparseIntは文字列を10進数表記と見なしint型に変換します。Stringクラスの引数とintの引数をとるparseIntでは引数で指定した基数を用いてint型に変換します。
public class Test {
public static void main(String args[]) {
System.out.println(Integer.parseInt("101010", 2));
System.out.println(Integer.parseInt("Abc000", 16));
}
}
|
C:\java>java Test
42
11255808
C:\java>
|
ところでJavaでコーディングするとき、「i = 0x1F;」など「0x」をつけると16進数という意味になります。しかしpaeseIntを用いた場合ではこのような接頭辞は使用できません。接頭辞を使用する場合はdecodeメソッドを使用します。
decodeメソッドのString型引数が、「0x」「0X」「#」ではじまると16進数として数値に変換します。また「0x」「0X」以外で「0」ではじまっている場合は8進数として数値に変換します。
詳しくはIntegerの章を参照してください。
さて、今までIntegerについて説明してきましたが、もっと大きな値を扱いたい場合はどうすればよいでしょうか。実はBigIntegerのコンストラクタもparseIntと同じようなものが用意されています。
もう1つ問題があります。10,000を現すのに「1E4」と現したいときはどうすればよいでしょうか?decodeメソッドはE表記を許していません。E表記を認めてくれるのは小数点の表記の時です。ですからDoubleクラスを利用します。
import java.math.*;
public class Test {
public static void main(String args[]) {
System.out.println( Double.valueOf("2E4").intValue() );
}
}
|
C:\java>java Test
20000
C:\java>
|