
JSで32ビット符号付き整数に対してのビット演算でハマった
2021-02-173 min read
目次
概要
JSでサブネットマスクの計算を行おうとしたとき、ビット演算でハマりました。その時のメモです。
JSでビット演算子を利用する場合 32ビットを超える整数を扱う場合は論理右シフト>>>
などを利用して変換するなどの対応が必要そうです。
具体例
例えば64などの32ビット符号付き整数の範囲に収まる数値に対して論理和を計算すると次のような結果となります。
※符号付き32ビット整数は -2の32乗から2の32乗-1 (−2,147,483,648 から 2,147,483,647) を表現できます。
console.log(64); // 64
console.log(64 | 0); // 64
console.log(-64 | 0); // -64
console.log(2147483647 | 0); // 2147483647
しかし32ビット符号付き整数の範囲内で計算できれば良いのですが、
例えば、192.168.0.1 のようなIPアドレスの値を10進数に変換する場合 3232235521
となります。
このように、この範囲を超えた数値を計算しようとした際に意図せず負の値となっていました。
console.log(2147483648 | 0); // -2147483648
console.log(3232235521 | 0); // -1062731775
この計算では32ビットで表せる数値を全て符号なしの整数として表現したかったので、変換する方法を探したところ "符号なし右シフト演算子" で符号なしの表現に変換することができました。
console.log((2147483648 | 0) >>> 0); // 2147483648
console.log((3232235521 | 0) >>> 0); // 3232235521
参考にしたサイト
Recommends
New Posts
Hot posts!
Date
Tags
Author