2010-03-21

符号付き16ビット整数の左ビットシフトをRhinoでやってみる

シフト数を16にした時に、ようやく(value << shiftCount)だとダメだと気付いた。
function shiftLeft16(value, shiftCount) {
    return ((value & 0x7FFF) << shiftCount) | (value & ~0x7FFF);
}
function printValue16(value) {
    java.lang.System.out.println(
        value + "(" + java.lang.Integer.toBinaryString(value & 0xFFFF) + ")");
}

var value = -1;
printValue16(value);
printValue16(value << 16);
printValue16(shiftLeft16(value, 16));

// 結果は以下:
//-1(1111111111111111)
//-65536(0)
//-32768(1000000000000000)

Rhinoで独自プロパティを追加してJavaインタフェースを実装する

Javaインタフェースを実装するJavaScriptオブジェクトにプロパティを追加しておくと、Javaインタフェースで宣言されたメソッドからも利用できる。
var runner = new java.lang.Runnable() {
    // 独自プロパティを追加する
    message: "Hello, ",
    // Javaインタフェースのメソッドを実装する
    run: function() {
        // 追加しておいたプロパティを使用する
        java.lang.System.out.println(this.message + this);
    }
};
new java.lang.Thread(runner).start();
java.lang.Thread.currentThread().sleep(100); // スクリプト本体の実行が終わらないように少し待つ