2009年07月10日

【1日1Java】2進数、8進数、16進数への変換

intから2進数、8進数、16進数の文字列に変換する
逆に文字列からintに戻す

// JRE 1.6.0_07
// java.lang.Integer
// intから2進数、8進数、16進数表記を取得したり、またintに戻したり
// tag binary octal hex decode 

// 2進数にしてみる
String binary = Integer.toBinaryString( 100 );
System.out.println( binary );
  // => 1100100

// 8進数にしてみる
String oct = Integer.toOctalString( 100 );
System.out.println( oct );
  // => 144

// decodeで8進数文字列をintに戻す
// 最初に0が付いてれば、8進数として認識する
int iOct = Integer.decode( "0" + oct );
System.out.println( iOct );
  // => 100

// 16進数にしてみる
String hex = Integer.toHexString( 100 );
System.out.println( hex );
  // => 64

// decodeで16進数文字列をintに戻す
// 最初に0xが付いてれば、16進数として認識する
int iHex = Integer.decode( "0x" + hex );
System.out.println( iHex );
  // => 100

// decodeは最初から0とか0xが付いてる文字列を、自動判別して戻す用で、
// 何進数か分かっているなら普通にparseIntを使う気もする

// parseIntで2進数文字列をintに
System.out.println(
        Integer.parseInt( "1100100", 2 ) );
  // => 100

// parseIntで8進(ry
System.out.println(
        Integer.parseInt( "144", 8 ) );
  // => 100

// 前に0が付いてる8進数の場合でも、radixを指定しなければ10進数として扱う
// 確かJavaScriptは自動判別して逆に面倒だった気がする
System.out.println(
        Integer.parseInt( "0144" ));
  // => 144

// parseIntで16(ry
System.out.println(
        Integer.parseInt( "64", 16));
  // => 100

// ちなみに0xとか付いてると例外になるので、そういう場合はdecodeを使うんだと思われる
System.out.println(
        Integer.parseInt( "0x64", 16 ));
  // => java.lang.NumberFormatException

// 変換については、toStringで基数指定してもOK
String str;
str = Integer.toString( 100, 2);
System.out.println( str );
// => 1100100

str = Integer.toString( 100, 8);
System.out.println( str );
// => 144

str = Integer.toString( 100, 16);
System.out.println( str );
// => 64