1. 13 bit0
  2. 13 bit1
  3. 13 bit2
  4. 13 bit3
  5. 13 bit4
  6. 0 bit0
  7. 1024 bit10
コース一覧
コンピューターサイエンス入門:理論編
ビットAND演算でフラグ判定

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

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分

ビットAND演算でフラグ判定

真偽値を 8 個ならべて持ち回るのはつらい

通知設定を考えます。メールを送るか、プッシュを出すか、SMS を出すか。真偽値で 1 つずつ持つと、設定が増えるたびに引数もテーブルの列も増えていきます。10 個になれば 10 個分です。

けれどこれは、オンかオフかが 10 個並んでいるだけです。2 進数の 1 桁が表せるのも、まさにオンかオフでした。つまり整数 1 個の中に、設定を何個でも詰め込めます。詰めたあとに要るのが、「この桁は立っているか」を取り出す道具です。

AND は、桁ごとに独立して計算する

& は 2 つの数を桁ごとに見比べて、両方が 1 の桁だけ 1 を残します。片方でも 0 なら 0 です。

プレーンテキスト

0 & 0 = 0 0 & 1 = 0 1 & 0 = 0 1 & 1 = 1

大事なのは、桁と桁がまざらないことです。足し算と違って繰り上がりが起きません。1101 & 1010 は、左から 1&1、1&0、0&1、1&0 をそれぞれ計算して 1000 になります。隣を気にせず 4 回の独立した計算をしているだけです。

見たい桁だけ 1 のマスクを当てる

両方が 1 のときだけ残る、ということは、片方を「見たい桁だけ 1、ほかは全部 0」にしておけば、結果に残るのはその桁の情報だけになります。この相手役をマスクと呼びます。

Python

MAIL = 0b001 PUSH = 0b010 SMS = 0b100 settings = 0b101 # メールと SMS だけオン print(settings & MAIL) # 1 print(settings & PUSH) # 0 print(settings & SMS) # 4

マスクの正体は、その桁の重みそのものです。PUSH は右から 2 桁目なので 2、SMS は 3 桁目なので 4。桁の重みを並べた表の数が、そのままマスクの値になります。

結果は 0 かどうかで見る

上の出力をもう一度見てください。SMS はオンなのに、返ってきたのは 1 ではなく 4 でした。残るのはその桁の重みなので、上の桁ほど大きい数になります。

ここで == 1 と比べてしまうと、いちばん右の桁以外は全部オフ扱いになります。しかもいちばん右の桁だけはたまたま通るので、テストの並び順によっては最後まで気づきません。判定は必ず「0 かどうか」で書いてください。

解説

現場の話 UNIX の権限 chmod 755 の 7 は、読み 4、書き 2、実行 1 を足した数です。権限 & 2 が 0 でなければ書き込める、という判定が今も動いています。

要件

  1. n と k は 0 以上の整数と仮定して良い (k は 30 未満)
  2. ビット演算 & と << を使うこと
  3. 戻り値は boolean (True/False or true/false) で返すこと

入出力例

isBitSet(13, 0) → true isBitSet(13, 1) → false isBitSet(13, 2) → true isBitSet(13, 3) → true isBitSet(13, 4) → false isBitSet(0, 0) → false isBitSet(1024, 10) → true

ヒント

マスクは 1 << k で作る。k = 0 ならマスクは 1、k = 2 なら 100 (= 4)

n & マスク が 0 でなければビットが立っている。必ず括弧で囲むこと (演算子優先順位)

戻り値は (n & (1 << k)) != 0 のように比較した結果を返す

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

関連レッスン

  • OR / XOR でフラグを操作する

    ビット OR でフラグを立て、XOR でフラグを反転させる手法を学び、複数フラグの統合を実装する。

  • popcount で 1 のビット数を数える

    整数を 2 進数で表したときに含まれる 1 の個数 (popcount) を求める関数を実装する。

  • シフト演算で 2 倍 / 半分

    左シフトと右シフトで 2 のべき乗倍 / 除算を高速に行う仕組みを学び、シフト演算による倍率変換を実装する。

  • 16 進数から 10 進数への変換

    16 進数 (hexadecimal) の文字列を 10 進数の整数に変換する関数を実装し、4 ビット = 1 桁の関係を理解する。

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

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

  • 引数位置引数=順番で渡す。
  • テーブルDB の表 (Excel のシートみたいなもの)
  • テストバグを見つける工程
  • ビット2進数の1桁。0 か 1 のどちらか
  • 戻り値呼び出し元への返答を表す点線矢印
main.py
学習モード
エディタを読み込んでいます

メモ

ビットAND演算でフラグ判定

⌘S で保存