2009年07月12日

【1日1Java】Integerのビット操作関連メソッド

Integerクラスにビット操作関連メソッドがいくつかいたので使ってみる


// JRE 1.6.0_07
// java.lang.Integer
// Integerクラスのビット操作関連メソッド
// tag bit

//////////////////////////////////////////////////
// SIZE;
// Integerのビットのサイズ
System.out.println( Integer.SIZE );
  // => 32

//////////////////////////////////////////////////
// bitCount
for( int i = 100; i < 103; i++ ) {
    // バイナリ表現
    String bin = Integer.toBinaryString( i );
    // bitCountの結果
    int cnt = Integer.bitCount( i );
    // 結果表示
    System.out.println( bin + " : " + cnt );
}
// 結果
// 2進数表示 : bitCount結果
// 1100100 : 3
// 1100101 : 4
// 1100110 : 4
// 1100111 : 5
// 1101000 : 3
// 1の数がカウントされていることが分かる
// ちなみにbitCountのソースでは黒魔術が使われている

//////////////////////////////////////////////////
// highestOneBit
// 1が立っているビットの中で一番左
for( int i = -1; i < 5; i++ ) {
    // バイナリ表現
    String bin = Integer.toBinaryString( i );
    // highestOneBitの結果
    int cnt = Integer.highestOneBit( i );
    // 結果表示
    System.out.println( bin + " : " + cnt );
}
// 結果
// 2進数表示 : highestOneBit結果
// 11111111111111111111111111111111 : -2147483648
// 0 : 0
// 1 : 1
// 10 : 2
// 11 : 2
// 100 : 4
// 一番左端のビット以外が0だった場合の値が出力される
// これのソースも黒魔術チックだけど、bitCountよりは数段分かり易い

//////////////////////////////////////////////////
// lowestOneBit
// 1が立っているビットの中で一番右
for( int i = -1; i < 5; i++ ) {
    // バイナリ表現
    String bin = Integer.toBinaryString( i );
    // lowestOneBitの結果
    int cnt = Integer.lowestOneBit( i );
    // 結果表示
    System.out.println( bin + " : " + cnt );
}
// 結果
// 2進数表示 : lowestOneBit結果
// 11111111111111111111111111111111 : 1
// 0 : 0
// 1 : 1
// 10 : 2
// 11 : 1
// 100 : 4

//////////////////////////////////////////////////
// reverse
// ビットを逆転する
for( int i = 17; i < 20; i++ ) {
    // バイナリ表現
    String bin = Integer.toBinaryString( i );
    // bitCountの結果
    int cnt = Integer.reverse( i );
    // 結果表示
    System.out.println( i + " : " + bin + " | " + 
            Integer.toBinaryString( cnt ) + " : " + cnt );
    
}
// 結果
// 17 : 10001 | 10001000000000000000000000000000 : -2013265920
// 18 : 10010 | 1001000000000000000000000000000 : 1207959552
// 19 : 10011 | 11001000000000000000000000000000 : -939524096
// 32ビットで考えて逆転させる

//////////////////////////////////////////////////
// reverseBytes
// バイト単位で逆転する
for( int i = 17; i < 20; i++ ) {
    // バイナリ表現
    String bin = Integer.toHexString( i );
    // bitCountの結果
    int cnt = Integer.reverse( i );
    // 結果表示
    System.out.println( i + " : " + bin + " | " + 
            Integer.toHexString( cnt ) + " : " + cnt );
}
// 結果
// 元の数字(10進) : 元の数字(16進数) | 変換後の数字(16進数) : 変換後の数字(10進)
// 17 : 11 | 88000000 : -2013265920
// 18 : 12 | 48000000 : 1207959552
// 19 : 13 | c8000000 : -939524096

//////////////////////////////////////////////////
// rotateLeft
// バイトを左に指定数だけ進める
// とりあえず「8」という数を0〜3までシフトしてみる
int num = 8;
for( int i = 0; i < 4; i++ ) {
    int ret = Integer.rotateLeft( num, i );
    System.out.println( Integer.toBinaryString( i ) + " | " + 
            Integer.toBinaryString( ret ) + " : " + ret );
}
// 結果
// 0 | 1000 : 8
// 1 | 10000 : 16
//10 | 100000 : 32
//11 | 1000000 : 64