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

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

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分

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

ログに 3232235777 と出ていても、誰の接続なのかは分かりません。保存や比較のために整数へ直したものは、人に見せる前に元の表記へ戻す必要があります。前回の逆をたどります。

数のままでは、誰も読めない

整数は機械にとって扱いやすく、人にとっては読めません。DB には整数で入れておき、画面やログに出す直前に点で区切った形へ戻す、という使い分けをします。詰めるときに上から順に載せたので、戻すときも上から順に取り出します。

整数のまま持っておく利点も、ここで確かめておきます。1 つの数なら、範囲の判定も並べ替えも索引も素直に効きます。読めないという欠点は、出す直前に直せば済む話です。

上の桁から順に取り出す

日付を 1 つの整数に詰めたものから、年と月と日を取り出す例で考えます。

Python

packed = 20260826 year = packed // 10000 month = packed // 100 % 100 day = packed % 100 print(year, month, day) # 2026 8 26

上の桁がほしいときは大きい数で割って下を落とします。真ん中がほしいときは、割って下を落としてから、余りで上を落とします。一番下は余りを取るだけです。上下から挟んで 1 つ取り出す、という手順は変わりません。

10 進で // と % を使ったところが、2 進では右へずらす >> と & 0xFF にあたります。IPv4 は 8 ビットずつ 4 つに分かれているので、ずらす量は 8 の倍数です。一番下のオクテットは、もう右端にいるのでずらす必要がありません。

取り出したあとの値は、必ず 0 から 255 のあいだに収まっているはずです。300 のような値が出てきたら、下 8 ビットだけを残す手順が抜けていて、上のビットが混ざっています。

プレーンテキスト

134744072 を 4 つに分ける 上から 8 | 8 | 8 | 8 つないで 8.8.8.8

並べる向きを間違えると、逆さまになる

取り出した 4 つを点でつなぐとき、上のオクテットが先です。順番を取り違えると 1.1.168.192 のように反対から並んだ文字列ができます。値としては 4 つとも正しいので、目で見ても気づけません。テストで初めて分かります。

文字列にするところにも罠があります。数どうしを + でつなぐと、連結ではなく足し算になってしまうことがあります。書式指定を使うか、いったん文字列に直してから連結します。区切りの点は 3 つで、両端には付きません。

JavaScript では >> が符号付きの右シフトなので、最上位のビットが 1 の値を扱うと符号が広がって負の数が出てきます。

JavaScript

console.log(0xFFFFFFFF >> 4); // -1 console.log(0xFFFFFFFF >>> 4); // 268435455

>> は空いた上の桁に符号を詰めるので、いくらずらしても負のままです。ここでも割り算と余りで書くほうが安全です。

標準ライブラリにも同じ変換があります。Python なら ipaddress の一族が、点で区切った表記と整数の行き来をまとめて面倒を見てくれます。実務ではそちらを使いますが、中で何が起きているかを一度手で書いておくと、値がおかしいときにどこを見ればよいかが分かります。

なお、詰める関数と戻す関数を続けて呼べば、必ず元の値に戻るはずです。この往復が一致するかどうかは、片方だけを見ていても分からない間違いを見つけてくれます。

要件

  1. 右シフトと 0xFF マスクで 4 つのオクテットを取り出す
  2. . で連結したドット区切り文字列を返す
  3. 0 のときは '0.0.0.0' を返す

入出力例

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

ヒント

(n >> 24) & 0xFF, (n >> 16) & 0xFF, ... の順で 4 つ取り出す

JavaScript ではビットシフトが 32bit 符号付きになるため、割り算と剰余で書くと安全

Python なら f-string、JavaScript ならテンプレート文字列で結合する

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

関連レッスン

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

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

  • 単純チェックサム

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

  • 第6章まとめクイズ

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

  • 重複データを 1NF に変換 (フラットなリスト化)

    1 セルに複数値が詰め込まれた CSV 風データを、1 行 = 1 値にフラット化する第一正規形(1NF)の変換を実装します。

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

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

  • ビット2進数の1桁。0 か 1 のどちらか
  • テストバグを見つける工程
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 標準ライブラリPythonに同梱の公式モジュール群
  • 関数処理に名前を付けて再利用できる単位
main.py
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存