1. sakamotoryouta

    Posted

    sakamotoryouta
Changes in title
+JSでIPアドレスをビット演算子で計算する
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,63 @@
+# '192.168.11.0' みたいなのを、32bit数値にする
+
+IPアドレスをCIDRで色々やったりする必要がありました。
+最初は以下のようなコードを書いてました。
+**うろ覚え・・・**
+
+```javascript
+function convertBinaryIp(ip) {
+ const dividedIp = ip.split('/')[0].split('.').reverse();
+
+ return dividedIp.reduce((accumulator, v, idx) => {
+ const bit = `00000000${parseInt(ip[i], 10).toString(2)}`;
+ accumulator + bit.slice(-8);
+
+ return accumulator;
+ }, '');
+ }
+```
+
+このコードで行くと、文字列で`10101010000~~`みたいなのが返ってきます。
+なので、その後の計算も文字列にたいして`split()`したりしてました。
+
+# 数値Onlyでやったほうが効率的
+いちいち文字列の`10101000111~~`みたいな形式にするの非効率だよと教えて頂きました。
+さらに、どうやって数値Onlyでやるかみたいなアドバイスも頂けたので処理を書き換えました。
+
+```javascript
+function convertBinaryIp(ip) {
+ const dividedIp = ip.split('/')[0].split('.').reverse();
+ const byte = 8;
+
+ return dividedIp.reduce((accumulator, v, idx) => {
+ const binary = (parseInt(v, 10) << (byte * idx)) >>> 0;
+ return accumulator + binary;
+ }, 0);
+ }
+```
+
+この関数を`convertBinaryIp('192.168.11.0')`みたいな感じで実行してあげれば、
+`3232238336`のような数値が返ってきます。
+この数値は2進数に直すと、`11000000101010000000101100000000`です。
+
+```
+11000000 => 192
+
+10101000 => 168
+
+00001011 => 11
+
+00000000 => 0
+```
+
+この`3232238336`という数値を使えば、他のIPとの大小比較とかCIDRの範囲内か?とかもチェックできます。
+
+
+CIDRの時に使用する、
+上位24ビットをそのまま取得して、下位8ビットは0にするというような場合の式は以下です。
+
+```
+(ipアドレス & (~((1 << (32 - 24)) - 1))) >>> 0;
+```
+
+以上。