2進数マジック(年齢当てカードの秘密)
「この中にあなたの数字はある?」5つの質問で心を読み当てる数理手品
- 1
- 1〜31までの数字の中から相手に1つ思い浮かべてもらい、5枚のカードを見せるだけで瞬時に言い当てるマジック
- 2
- タネは『コンピュータが動く原理である2進数(バイナリ)』そのもの
- 3
- 各カードの左上(最小の数)である 1, 2, 4, 8, 16 を足すだけで、相手の数字が自動的に復元される
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
子どもから大人まで、一見すると超能力に見えるマジックが『たった5桁の2進数の足し算』だと分かった瞬間のアハ体験。コンピュータがなぜ0と1だけで全てを表現できるのかを身体感覚で理解できる。
身につく武器・思考力
位取り記数法と基数変換の直感理解、ビットマスク・論理演算のセンス、手品としての披露力
実社会・ITでの活躍現場
- •コンピュータのCPU(算術論理演算装置 ALU)の二進数加算器
- •通信のエラー訂正符号(ハミング符号:どのビットが反転したかを特定する仕組み)
- •バーコードやQRコードのバイナリエンコーディング
- •20の扉ゲームや二分探索(バイナリサーチ)による効率的データ検索
Layer 1 — 直感・シミュレーター
1〜31の中で好きな数字(あなたの年齢や誕生日など)を1つ心の中で決めてください。画面に現れる5枚のカードについて『このカードの中に自分の数字があるか?』をYes/Noでタップしていくだけで、AIがあなたの心の中の数字を100%言い当てます!
質問 1 / 5 : このカードの中にあなたの数字はありますか?
相手が思い浮かべた数字が『19』だった場合、カード1(1), カード2(2), カード3(4), カード4(8), カード5(16) のうち、どのカードに19が含まれているでしょうか?
Layer 2 — 定義・受験・証明
定義
**2進数(Binary)による一意分解**: 任意の正の整数 は、2のべき乗 の和として重複なく唯一通りに表すことができる。
カード ()には、**『2進数で表したときに下から 桁目のビットが 1 である数字』** だけを集めて印刷してある。
公式・数理モデル
証明・導出
**手品のタネあかし(なぜ左上の数を足すだけで当たるのか?)**
各カードの最も小さい数(左上の数)に注目すると: - カード 1: 最小の数は () - カード 2: 最小の数は () - カード 3: 最小の数は () - カード 4: 最小の数は () - カード 5: 最小の数は ()
例えば相手が「」を選んでいた場合: を2進数に直すと 、すなわち `11001`(2進数)である。 - カード 1 (1の位): **ある (Yes)** → +1 - カード 2 (2の位): **ない (No)** → +0 - カード 3 (4の位): **ない (No)** → +0 - カード 4 (8の位): **ある (Yes)** → +8 - カード 5 (16の位): **ある (Yes)** → +16
手品師は「Yes」と言われたカードの左上の数()を頭の中で足し算するだけで、瞬時に「あなたの数字は ですね!」と言い当てることができる。
押さえておきたいポイント
- カードが5枚あれば まで、6枚あれば まで判定可能
- カードの数字の並び順をランダムにシャッフルしておけば、相手に2進数の規則性を悟られにくく手品として強力になる
- 情報理論の始祖シャノンが提唱した『1ビット = 二者択一の質問1回分』という情報量の定義をそのまま体現している
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
ビットフラグ(Bitmasking)と効率的な状態管理
ゲーム開発や低レイヤーシステムプログラミングにおいて、1つの整数(32bit int)の各ビットに「毒状態」「麻痺状態」「飛行状態」などのフラグを割り当て、ビット論理積(AND)や論理和(OR)により超高速で判定・更新する手法。
1// 2進数マジックカード生成 & ビットマスク判定2export interface MagicCard {3 bitValue: number; // 1, 2, 4, 8, 164 numbers: number[];5}67/** 1〜maxNumber を判定するための n 枚のカードを生成 */8export function generateBinaryMagicCards(bits = 5): MagicCard[] {9 const cards: MagicCard[] = [];10 const maxNumber = (1 << bits) - 1; // 311112 for (let bit = 0; bit < bits; bit++) {13 const bitValue = 1 << bit; // 2^bit14 const numbers: number[] = [];1516 for (let n = 1; n <= maxNumber; n++) {17 // bit桁目が1の数字だけを含める18 if ((n & bitValue) !== 0) {19 numbers.push(n);20 }21 }2223 cards.push({ bitValue, numbers });24 }2526 return cards;27}2829/** 回答配列 (Yes=true, No=false) から元の数字を復元 */30export function guessNumber(answers: boolean[]): number {31 return answers.reduce((sum, isYes, idx) => {32 return isYes ? sum + (1 << idx) : sum;33 }, 0);34}
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元