1. 0.0.0.0 -> 0
  2. 127.0.0.1 -> 2130706433
  3. 192.168.1.1 -> 3232235777
  4. 255.255.255.255 -> 4294967295
  5. 10.0.0.1 -> 167772161
  6. 172.16.0.1 -> 2886729729
  7. 8.8.8.8 -> 134744072
コース一覧
コンピューターサイエンス入門:理論編
IPv4 アドレスを 32bit 整数に変換

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

IPv4 アドレスを 32bit 整数に変換

アクセス元の IP を並べ替えたら、9.0.0.0 が 10.0.0.0 より後ろに来た。文字列のまま比べると辞書順になるので、こういうことが起きます。IP を数として扱えば、比較も範囲の判定も素直に書けます。

文字列のままだと、大小が狂う

IPv4 アドレスを点で区切って書くのは、人が読むための表記です。中身は 32 ビットの整数 1 つです。整数に直しておくと、大小の比較がそのまま使えて、DB の 1 カラムに入れて索引も効き、ある範囲に入っているかどうかも 1 回の計算で判定できます。ネットワーク機器の内側では、最初から整数として扱われています。

アクセスログを日付でまたいで集計するときも、遮断したい範囲を設定に書くときも、比べる相手が数であれば話が早くなります。文字列の比較は 1 文字ずつ辞書の順で進むので、桁数の違う数を並べた瞬間に破綻します。

4 つの数を、8 ビットずつ棚に載せる

点で区切られた 4 つの数は、それぞれ 0 から 255 までで、ちょうど 8 ビットに収まります。これをオクテットと呼びます。4 つを 1 つの整数にまとめるには、置きたい場所まで左へずらしてから重ねます。

プレーンテキスト

192 . 168 . 1 . 1 | | | +--- 一番下の 8 ビット | | +------- その上の 8 ビット | +------------ その上の 8 ビット +------------------ 一番上の 8 ビット

左へずらすのが << です。x << 8 は 8 ビットぶん左へ動かすことで、10 進で言えば 256 倍にあたります。ずらす量が違えば、それぞれの 8 ビットは重なりません。重ならないので、まとめる操作は | でも + でも同じ結果になります。

同じ形は色でも使われています。赤と緑と青の 3 成分を 1 つの整数にまとめる書き方です。

Python

r, g, b = 0x33, 0xAA, 0x66 color = (r << 16) | (g << 8) | b print(hex(color)) # 0x33aa66

取り出すときは逆の手順です。>> で右へ戻してから、& 0xFF で下 8 ビットだけを残します。0xFF は 8 ビットすべてが 1 の値で、これと重ねると下 8 ビット以外が消えます。

Python

print((color >> 8) & 0xFF) # 170 緑の成分

重ねる位置を 1 つでも取り違えると、隣のオクテットと重なって両方の値が壊れます。16 進数で書き出してみると、8 ビットの区切りが 2 桁ごとの区切りとしてそのまま目に見えるので、確かめやすくなります。

点で区切られた文字列を数の並びに直すところは、区切り文字での分割で書けます。分割した結果は文字列のままなので、数に直してから使います。

上のオクテットを触ると、JavaScript では負になる

JavaScript のビット演算は、値を 32 ビットの符号付き整数として扱います。最上位のビットが 1 になる位置まで左へずらすと、結果が負の数になります。IPv4 は先頭のオクテットが 128 以上になることがあるので、この罠は必ず踏みます。

避け方は 2 つあります。>>> 0 を通して符号なしに戻すか、ずらす代わりに掛け算で書くかです。Python の整数には桁の上限が無いので、この心配はいりません。言語ごとに整数の器が違う、ということ自体が、ここで覚えておく値打ちのある話です。

要件

  1. ドット区切りの IPv4 文字列を 32bit 整数に変換する
  2. オクテットの順序は (a << 24) | (b << 16) | (c << 8) | d とする
  3. 255.255.255.255 が 4294967295 になるよう、符号なしの値として扱う

入出力例

ipToInt("0.0.0.0") → 0 ipToInt("127.0.0.1") → 2130706433 ipToInt("192.168.1.1") → 3232235777 ipToInt("255.255.255.255") → 4294967295 ipToInt("10.0.0.1") → 167772161 ipToInt("172.16.0.1") → 2886729729 ipToInt("8.8.8.8") → 134744072

ヒント

split('.') で 4 つのオクテットに分けてから整数化する

JavaScript ではビットシフトが 32bit 符号付きになるため、掛け算 (* 16777216 等) で計算するのが安全

Python の整数は任意精度なので << 24 でもオーバーフローしない

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 32bit 整数を IPv4 アドレスに変換

    32bit の整数を 192.168.1.1 のような IPv4 文字列に戻す関数を実装します。前レッスンの逆操作です。

  • CIDR プレフィックスからネットマスクを作る

    /24 のような CIDR プレフィックスから、対応する 32bit のネットマスク (上位 prefix bit が 1) を返します。

  • 単純チェックサム

    バイト配列の各要素を 256 (1 バイト) の範囲で足し合わせ、単純なチェックサムを計算します。

  • 第6章まとめクイズ

    ネットワークと符号化 (Base64 / URL エンコード / IPv4 / CIDR / チェックサム) の理解度を確認するクイズです。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • ビット2進数の1桁。0 か 1 のどちらか
  • カラムテーブルの「縦の列」
  • JavaScriptWeb で動的な振る舞いを担う言語
main.py
学習モード
エディタを読み込んでいます

メモ

IPv4 アドレスを 32bit 整数に変換

⌘S で保存