コンピュータ言語では10進数以外には2進数、8進数、16進数などがよく使われます。Javaでも数字リテラルといい直接これらの数字を表現する方法があります。ここでは数字リテラルの使い方と出力方法を書きます。これ以外の位取りの記数法、例えば12進数などはリテラルで表現できませんが扱うことは可能です。
数字リテラルの記述方法
例えば数字の7は2進数では111と表現します。ただこれを
int number = 111;
と表現することはできません。この場合10進数の111となってしまい7ではないからです。2進数を扱う場合にはこの数字の前に0bと書きます。bは大文字小文字どちらでも構いません。
int number = 0b111; System.out.println(number);
実行すると7が出力されます。
同様に8進数には頭に0をつけます。0で始まる整数は0以外なく0は10進数でも8進数でも同じ値なので問題ありません。10進数の10は8進数だと12になるので頭に0をつけて記述します。
int number = 012; System.out.println(number);
実行すると10が出力されます。
16進数は頭に0xをつけます。16進数は一桁で0から15までを表現します。このため10進数だと2桁になる10から15はAからFを数字と見立て記述されます。10進数の255はFFとなりますので以下のように記述します
int number = 0xFF; System.out.println(number);
実行すると255が出力されます。
intから文字列への変換
int型の変数をそのまま出力しても10進数で出力されてしまいます。2進数、8進数、16進数で出力するにはまず文字列に変換する必要があります。
int number = 0xFF; System.out.println(Integer.toBinaryString(number)); System.out.println(Integer.toOctalString(number)); System.out.println(Integer.toHexString(number));
実行結果は以下の通りです。16進数でFF、10進数で255を2進数、8進数、16進数で出力しています。
11111111 377 ff
これ以外の記数法では以下のように変換します。
int number = 144; System.out.println(Integer.toString(number, 12));
これは144という10進数を12進数の文字列に変換して出力しています。144は12の2乗なので12進数では100となります。
文字列からintへの変換
文字列を指定の位取りでintに変換します。以下はそれぞれ文字列”100″を16進数として変換した場合、12進数として変換した場合、10進数として変換した場合でそれぞれ出力しています。
System.out.println(Integer.parseInt("100", 16)); System.out.println(Integer.parseInt("100", 12)); System.out.println(Integer.parseInt("100", 10));
実行結果はそれぞれ256、144、100になります。
Javaで扱える位取りの上限
上記の二つのメソッドは一つ目に変換対象のintデータあるいは文字列、二つ目に位取りの数を指定しています。位取りの数字は2から36までです。Javaでは10を超える位取りの場合にはアルファベットを使います。16進数であれば足りない数字をアルファベットから6つ借りてきて使います。アルファベットは26文字あるので元の数字10文字とを足した36文字まで数字で使えることになります。2進数から36進数までです。
これが枯渇してしまう37以上は実行時に例外が発生してしまいます。これ以上大きな位取りを行うには自前で仕組みを作る必要があります。