1. 0,0 -> 2
  2. 0,1 -> 3
  3. 1,0 -> 1
  4. 1,1 -> 0
コース一覧
コンピューターサイエンス入門:理論編
NOT / XOR の真理値表

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

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分

NOT / XOR の真理値表

「食い違っていたら」を AND と OR だけで書くと長い

2 つの設定が食い違っていたら警告を出したい。前回の道具だけで書くと、「片方が真でもう片方が偽、または、片方が偽でもう片方が真」と、両方の場合を並べることになります。条件が増えるほど、この書き方は伸びていきます。

食い違いをひと目で見る演算が XOR です。あわせて、真偽をひっくり返すだけの NOT も押さえます。

OR の表を 1 行だけ変えると、XOR になる

前回の OR は、両方が偽の行だけが偽で、あとは全部真でした。XOR はそこに「両方が真の行も偽」が加わります。変わるのは最後の 1 行だけです。

つまり XOR が真になるのは、真がちょうど 1 つのときです。言い換えると、2 つが違うときだけ真になります。ちがい検出器だと思ってください。

NOT のほうは入力が 1 つで、真を偽に、偽を真に入れ替えるだけです。表を書くまでもありません。

Python

print(True ^ False) # True 違う print(True ^ True) # False 同じ print(not True) # False

XOR が効くのは、排他を確かめたいときです。「上書きと追記のどちらか一方だけを指定させたい」「新規と更新のどちらか一方だけが立っているはず」といった検査は、AND と OR を組み合わせて長く書くより、食い違いを 1 つの演算で見たほうが意図が残ります。両方指定も未指定も同じく弾きたい、という要求にそのまま重なります。

^ はべき乗ではない

Python で 2 ^ 3 を書くと、8 ではなく 1 が返ります。^ は XOR で、べき乗は ** です。数式の見た目に引きずられて ^ を書き、値が小さすぎることに何時間も気づかない、という事故がよく起きます。

JavaScript には真偽値どうしの XOR がありません。!== で代用するか、0 と 1 に直してから ^ を使います。真偽値をそのまま ^ に渡すと数として扱われるので、返るのも真偽値ではなく 0 か 1 です。返り値の型が変わる点に気をつけてください。

NOT は、重ねるほど読めなくなる

not (x > 0) と x <= 0 は同じ意味ですが、後者のほうがひと目で分かります。not not x に至っては、真偽値へ変換しているだけなのに、読む側は毎回立ち止まります。

否定は、書けるなら反対向きの比較へ書き換えたほうが後で困りません。条件式のレビューで指摘されるほとんどは、この読みにくさが原因です。

要件

  1. NOT a と a XOR b を 1 つの関数で計算する
  2. NOT a を bit1、XOR を bit0 に詰める
  3. 真理値表に従った結果になる

入出力例

notXor(0, 0) → 2 notXor(0, 1) → 3 notXor(1, 0) → 1 notXor(1, 1) → 0

ヒント

NOT a は a == 0 のとき 1、それ以外 0

XOR は a != b のとき 1、a == b のとき 0

(NOT_a << 1) | XOR で 2 ビットに詰める

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

関連レッスン

  • 含意 (→) を AND/OR/NOT で表現

    論理学の含意 a → b を AND/OR/NOT の組み合わせで実装し、0/1 で返す関数を作ります。「a ならば b」の真偽の不思議さも体感します。

  • ド・モルガンの法則

    ド・モルガンの法則を使って NOT (a AND b) を NOT a OR NOT b に変換する関数を実装し、等価性を実感します。

  • 第2章まとめクイズ

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

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

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

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

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

  • JavaScriptWeb で動的な振る舞いを担う言語
  • レビューコードを読み合い品質を上げる工程
  • ビュークエリに名前をつけて再利用する仮想表
  • 関数処理に名前を付けて再利用できる単位
main.py
学習モード
エディタを読み込んでいます

メモ

NOT / XOR の真理値表

⌘S で保存