unsigned byte を int に変換する。
「byte & 0xFF」とします。(→Java FAQ - S007 Q-11 - byte を符号無しとして(unsigned byte として)int と相互に変換するには?より)
byte b = -3; int i = b & 0xFF; System.out.println( i ); // 253
解説は、↑のサイトの通りですが、
- byteを普通にキャストすると、符号拡張とやらにより「intでの非unsigned byte値」になってしまう。
- そこで、さらに 0xFF との論理積を取ることで、
- 拡張された部分を除いた値を取り出せます。
// byte値 byte b = -3; System.out.println( toBinary(b) ); // 11111101 // 普通にキャストすると、intでの-3になってしまう。 int i = b; System.out.println( toBinary(i) ); // 11111111111111111111111111111101 // そこで 0xFF で & を取ると、 System.out.println( toBinary(0xFF) ); // 00000000000000000000000011111111 // うまいことunsignedの値が取り出せる。 System.out.println( toBinary(b & 0xFF) ); // 00000000000000000000000011111101 ... public static String toBinary( byte number ) { StringBuilder b = new StringBuilder(8); for ( int i = 7; i >=0; i-- ) { b.append( (number & (1 << i)) >> i ); } return b.toString(); } public static String toBinary( int number ) { StringBuilder b = new StringBuilder(32); for ( int i = 31; i >=0; i-- ) { b.append( (number & 1L << i ) >> i ); } return b.toString(); }
いや、なんかバグってる気がするなー、とは思っていたんだ。