1. 0,0 -> 1
  2. 0,1 -> 1
  3. 1,0 -> 1
  4. 1,1 -> 0
コース一覧
コンピューターサイエンス入門:理論編
ド・モルガンの法則

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

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分

ド・モルガンの法則

if not (logged_in and has_permission) が読めない

ログイン済みで、かつ権限がある人だけ通したい。素直に書くと、拒否する側はかたまり全体の否定になります。

Python

if not (logged_in and has_permission): deny()

読むときに、頭の中で 2 回ひっくり返すことになります。and の結果をいったん作って、それを否定する。条件が 3 つ 4 つと増えると、レビューで誰も追えなくなります。

かたまりの外にある not を、中へ配ってしまえば読みやすくなります。その配り方を決めたのが、ド・モルガンの法則です。

否定を内側に配る 3 手順

手順は次のとおりです。

  1. かたまりの外の not を消して、中の項ひとつひとつに not を付ける
  2. 真ん中の and を or に、or を and に入れ替える
  3. 項が比較式なら、not を付けたままにせず、反対向きの比較に直す

さきほどの条件に当てはめると、こうなります。

Python

if (not logged_in) or (not has_permission): deny()

「ログインしていない、または、権限が無い」と、そのまま日本語で読めるようになりました。項が 3 つ以上あっても手順は同じで、全部に not を配って、間の演算子をすべて入れ替えます。

なぜ and と or が入れ替わるのか

「両方そろっている、が成り立たない」を言い換えると、「どちらかが欠けている」です。全部そろう条件の否定は、1 つでも欠けていること。逆に「どちらも無い」の否定は、「少なくとも片方はある」です。

厳しい条件の否定は緩くなり、緩い条件の否定は厳しくなります。だから配ると and と or が入れ替わります。ここを入れ替え忘れると条件が狭くなりすぎて、通してよい人まで弾くか、その逆をやります。しかも動きはするので、報告が来るまで気づきません。

比較式の否定は、境界で間違える

3 番目の手順が、実は事故のもとです。not (x > 0) を x < 0 と書いてしまうと、x が 0 のときだけ結果が変わります。

> の反対は <=、< の反対は >= です。否定すると、等号の付いた側へ境界が移ります。== の反対が != なのは誰も間違えないのに、> と < は反射的に書き換えてしまいがちです。ずれるのは 1 件だけなので、テストデータの作り方によっては最後まで通ってしまいます。

要件

  1. (NOT a) OR (NOT b) と等価な処理を実装する
  2. a 1 かつ b 1 のときだけ 0 を返す
  3. それ以外は 1 を返す

入出力例

deMorgan(0, 0) → 1 deMorgan(0, 1) → 1 deMorgan(1, 0) → 1 deMorgan(1, 1) → 0

ヒント

ド・モルガン: NOT (a AND b) = (NOT a) OR (NOT b)

a == 0 OR b == 0 と書くのが素直

a と b の両方が 1 のときだけ False (0) になる

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

関連レッスン

  • 第2章まとめクイズ

    第2章「文字コードと真偽値ロジック」の理解度を測る 4 択クイズ。ASCII / UTF-8 / 論理演算 / ド・モルガンのポイントを総ざらいします。

  • forループの実行回数を返す

    for ループを n 回まわすときに、本当に n 回実行されているのかを自分の手で数え、計算量の感覚を掴む。

  • スタック (push/pop) を実装する

    後入れ先出し (LIFO) の代表選手であるスタックを、push と pop の操作シーケンスで動かす。

  • バイト → KB 変換

    1024 で割って KB に変換し、容量表示の基本を体得する

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

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

  • レビューコードを読み合い品質を上げる工程
  • ビュークエリに名前をつけて再利用する仮想表
  • 演算子//は切り捨て除算(7 // 2 = 3)。
  • テストバグを見つける工程
  • 処理計算や代入を表す長方形
main.py
学習モード
エディタを読み込んでいます

メモ

ド・モルガンの法則

⌘S で保存