読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

unsigned byte を int に変換する。

Java

「byte & 0xFF」とします。(→Java FAQ - S007 Q-11 - byte を符号無しとして(unsigned byte として)int と相互に変換するには?より)

byte b = -3;
int i = b & 0xFF;
System.out.println( i ); // 253

解説は、↑のサイトの通りですが、

  1. byteを普通にキャストすると、符号拡張とやらにより「intでの非unsigned byte値」になってしまう。
  2. そこで、さらに 0xFF との論理積を取ることで、
  3. 拡張された部分を除いた値を取り出せます。
// 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();
}

いや、なんかバグってる気がするなー、とは思っていたんだ。