latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

低レベルなビット操作関数を集約した WebModule ベースのライブラリ Bit.js を追加

結構な割合で必要となるビット演算系の関数をまとめた WebModule ベースのライブラリ Bit.js を追加しました。

こんな関数があります。

// make bit mask
Bit.mask(2)     // -> 0x03
Bit.mask(4)     // -> 0x0f

// bit split by bit-pattern
Bit.split(0xffff1234, [16,4,4,4,4])  // -> [0xffff,0x1,0x2,0x3,0x4]

// With ES6 Destructuring Assignment
// ES6 Destructuring Assignment と Bit.split を併用すると以下のように簡便に記述できます
var [u16, u8a, u8b] = Bit.split(0x00001234, [16, 8, 8]); // u16 = 0x0000, u8a = 0x12, u8b = 0x34

// population count (counting 1 bits)
Bit.popcnt(0x6) // -> 2

// Number of Leading Zero
Bit.nlz(0x6)    // -> 29

// Number of Training Zero
Bit.ntz(0x6)    // -> 1

// binary dump
Bit.bin(0x12345678, [4,4,8,4,4,8])
// -> "0001, 0010, 00110100, 0101, 0110, 01111000"

// binary(hex) dump
Bit.dump(0x12345678, [4,4,8,4,4,8]);
// -> "0001(1), 0010(2), 00110100(34), 0101(5), 0110(6), 01111000(78)"

// dump IEEE754 internal format
var doublePrecision = true;
var u32array = Bit.IEEE754(0.15625, doublePrecision);
Bit.bin(u32array[0], [1,11,20]) + Bit.bin(u32array[1], [32])
// -> "0, 01111111100, 0100000000000000000000000000000000000000000000000000"

Bit.IEEE754 は数値を IEEE754 表現のビット列に変換する関数です。
数値をネットワーク透過性のあるバイナリに変換するために、結構な頻度で必要になります。
そういえば MessagePack.js の内部でも同様の変換を使っていますね。

ビットを数える・探すアルゴリズム を大変参考にさせていただきました。

また、32bit の精度で NLZ を正しく実装 するには、Float32Array では精度不足で、 Float64Array が必要だったりするなど、ちょっとした学びがあったりました。