コンピューターサイエンス入門:理論編
32bit 整数を IPv4 アドレスに変換
この回でやること
整数から8ビットずつ取り出す手順を読み解き、IPv4の表示と往復の対応を確かめます。
- 読む 約 7 分
- 最後にクイズ 1 問
ログの 3232235777 は、IPを整数にした値です。保存や比較には便利でも、人に見せるときは元の表記へ戻します。
保存する形と表示する形を分ける
DBでは整数として範囲を比べ、画面やログに出す直前に点で区切った形へ戻します。ここでは0から4,294,967,295までの符号なし整数を考えます。
上の8ビットから順に取り出し、0も省略せず点でつなぎます。最初のログの値なら 192.168.1.1 になります。
割り算で下を落とし、余りで上を落とす
日付を1つの整数に詰めたものから、年と月と日を取り出す例で考えます。
Python
packed = 20260826
year = packed // 10000
month = packed // 100 % 100
day = packed % 100
print(year, month, day) # 2026 8 26// は端数を切り捨てる割り算、% は余りです。月なら100で割って日を落とし、100で割った余りで年を落とします。
IPv4では左から順に16,777,216、65,536、256、1で割って切り捨て、それぞれ256で割った余りを取ります。重みが256倍ずつ違うので、8ビットずつ取り出せます。
ビット演算なら右へずらす >> と、下8ビットを残す & 0xFF に相当します。右へずらすだけでは、上の部分も残ります。
上のオクテットから並べる
順番を逆にすると 1.1.168.192 という別のIPになります。各数の範囲は正しいので、異なる数を含む例で順序も確かめます。
JavaScriptでは符号付きの >> と符号なしの >>> が違います。
JavaScript
console.log(0xFFFFFFFF >> 4); // -1
console.log(0xFFFFFFFF >>> 4); // 268435455>> は負の符号を上の桁へ埋めます。符号なしなら >>> か割り算と余りを使います。実務ではPythonの ipaddress などの標準ライブラリも使えます。
例題で確かめる
整数16,909,060をIPv4へ戻します。各位置の割り算と余りを順に読みます。
プレーンテキスト
16,777,216で割って切り捨て → 1 → 256で割った余りは1
65,536で割って切り捨て → 258 → 256で割った余りは2
256で割って切り捨て → 66051 → 256で割った余りは3
1で割った値 → 16909060 → 256で割った余りは4答えは 1.2.3.4 です。各数に元の重みを掛けて足すと16,909,060に戻ります。