1. n=0 -> 0
  2. n=8 -> 0xFF000000
  3. n=16 -> 0xFFFF0000
  4. n=24 -> 0xFFFFFF00
  5. n=32 -> 0xFFFFFFFF
  6. n=1 -> 0x80000000
  7. n=4 -> 0xF0000000
  8. n=28 -> 0xFFFFFFF0
コース一覧
コンピューターサイエンス入門:理論編
CIDR プレフィックスからネットマスクを作る

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

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分

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

設定に 192.168.0.0/16 と書いたとき、ある IP がこの範囲に入っているかを、誰がどう判定しているのでしょうか。答えはビット演算 1 回です。その道具になるのがネットマスクです。

この IP は、この範囲に入っているのか

/16 や /24 は CIDR と呼ばれる書き方で、32 ビットのうち上から何ビットがネットワークを表すかを示します。/24 なら、上の 24 ビットが同じ相手は同じネットワークにいて、残りの 8 ビットが個々の機器の番号です。/32 は 1 台だけを指し、/0 はすべての IP を指します。

昔はこれを 255.255.255.0 のように点で区切って書いていましたが、いまは /24 の形で書くのが普通です。書き方が変わっただけで、指しているものは同じです。

上から n ビットだけ 1 にする

ネットマスクは、ネットワーク側のビットを 1、機器側のビットを 0 にした 32 ビットの値です。/24 なら 16 進で FF FF FF 00 と並びます。上の 24 個が 1、下の 8 個が 0、という並びがそのまま見て取れます。

プレーンテキスト

/24 のネットマスク 11111111 11111111 11111111 00000000 FF FF FF 00

作るときの勘所は、1 をどこまで並べるかです。下から数えて何ビットを 0 にするか、と裏返して考えると、32 - n という数が出てきます。

似た形で、下のほうだけを 1 にしたいこともあります。ハッシュ値を 2 の n 乗個の入れ物に振り分けるときなどです。

Python

n = 4 low_mask = (1 << n) - 1 # 0b1111 print(hash("key") & low_mask) # 0 から 15 のどれか

1 << n は 1 を n 個ぶん左へ動かした値で、そこから 1 を引くと下の n ビットがすべて 1 になります。ネットマスクは、これの上下が入れ替わった形です。

注意が 1 つあります。n が端の値のとき、ずらす量が 32 になります。32 ビットの値を 32 ビットずらす動きは言語ごとに違い、0 になるものも、元のままのものもあります。両端は先に切り分けておくと安全です。

作った値が正しいかどうかは、16 進で書き出して並びを見るのが早いです。1 の列と 0 の列の境目が、n 個目のところに来ていれば合っています。下のほうが 1 になっていたら、上下が逆さまです。

下位を捨ててから比べる

マスクさえ作れれば、範囲の判定は AND 1 回で終わります。

Python

mask = 0xFFFFFF00 # /24 ip = 0xC0A8012A # 192.168.1.42 net = 0xC0A80100 # 192.168.1.0 print(ip & mask == net & mask) # True

AND を取ると、マスクが 0 の位置は問答無用で 0 になります。つまり機器の番号にあたる部分が消えて、ネットワークの部分だけが残ります。残った部分どうしが一致すれば、同じネットワークです。ルーターが行き先を選ぶときの最長一致も、プレフィックスの長い順にこの比較を繰り返しているだけです。

要件

  1. 上位 n bit が 1、下位 (32 - n) bit が 0 の 32bit 整数を返す
  2. n=0 のとき 0、n=32 のとき 4294967295 を返す
  3. n の範囲は 0 から 32

入出力例

cidrMask(0) → 0 cidrMask(8) → 4278190080 cidrMask(16) → 4294901760 cidrMask(24) → 4294967040 cidrMask(32) → 4294967295 cidrMask(1) → 2147483648 cidrMask(4) → 4026531840 cidrMask(28) → 4294967280

ヒント

公式: (0xFFFFFFFF << (32 - n)) & 0xFFFFFFFF

JavaScript では Math.pow(2, 32) - Math.pow(2, 32 - n) で書くと 32bit 符号の罠を避けられる

n=0 と n=32 の境界を早期 return で分岐すると安全

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

関連レッスン

  • 単純チェックサム

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

  • 第6章まとめクイズ

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

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

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

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

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

  • ビット2進数の1桁。0 か 1 のどちらか
  • CIDRIPレンジ表記。例 10.0.0.0/16
  • ルーターURL ごとの処理を束ねたモジュール
main.py
学習モード
エディタを読み込んでいます

メモ

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

⌘S で保存