低レベルなビット操作関数を集約した 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 が必要だったりするなど、ちょっとした学びがあったりました。