この記事は『数学ガールの秘密ノート/ビットとバイナリー』として書籍化されています。
登場人物紹介
僕:数学が好きな高校生。
ユーリ:僕のいとこの中学生。僕のことを《お兄ちゃん》と呼ぶ。
ユーリ「お兄ちゃん、インフル治ってよかったね!」
僕「熱出て、たいへんだったよ。《変幻ピクセル》イベントはどうだった?(第103回参照)」
ユーリ「ミルカさまが来てなくて残念だったけど、すんごく楽しかった! あのね、 ミルカさまもインフルだったんだって。流行ってんだね」
僕「ああ……そうだろうね」
ユーリ「ミルカさまはいなかったけど、テトラさんとリサ姉が案内してくれたんだよ」
僕「うん(リサ姉?)」
ユーリ「リサ姉って、あんまりしゃべんないけど、とっても親切なんだよ。知ってた?」
僕「そうだね。世話好きみたいだよ。どんな展示だった?」
ユーリ「あのね……」
ユーリはあちこち話を脱線させながらも、 双倉図書館でのイベントを説明してくれた。
僕「それはおもしろいなあ。スキャナとフィルタとプリンタ」
ユーリ「そんでね、リサ姉からコンピュータのこと、 たくさん教えてもらっちゃった。お兄ちゃん、詳しくないでしょ。 今日はユーリがコンピュータの計算について教えたげるよ。 資料ももらってきたし」
僕「それはそれは。今日はユーリ先生の講義か……」
ユーリはトランプくらいの大きさのカードを一枚取り出した。
ユーリ「そんじゃ、お兄ちゃんにクイズ! これ、なーんだ?」
カード1(これ、なーんだ?)
$$ \begin{array}{cccc} 0 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ \hline 1 & 1 & 0 & 0 \\ \end{array} $$
僕「いやいや、このくらいは僕も知っているよ。 これは $2$ 進法の計算をしているんだね。 $10$ 進法で筆算するのと同じようにして、 $2$ 進法でも筆算はできるから。《$2$ になったら繰り上がりする》ところだけが違うけど」
ユーリ「ほー」
僕「だから、このカード1は $(0011)_2$ と $(1001)_2$ の加算をしているんだろ? $2$ 進法で $0011$ は $10$ 進法の $3$ で、 $2$ 進法で $1001$ は $10$ 進法の、ええと、何だろう。 $1,2,4,8$ だから、 $8+1=9$ だね」
ユーリ「お兄ちゃん、計算速いね」
僕「確かに、 $(0011)_2 + (1001)_2 = (1100)_2$ になってる。 だって、 $2$ 進法の $1100$ は $10$ 進法の $12$ になってて、 $(3)_{10}+(9)_{10} = (12)_{10}$ だからね」
僕の解答
これは、 $3+9=12$ の加算をしている。
$$ \begin{array}{cccccrcrrrr} 0 & 0 & 1 & 1 & \cdots & (0011)_2 & \cdots & (3)_{10} \\ 1 & 0 & 0 & 1 & \cdots & (1001)_2 & \cdots & (9)_{10} \\ \hline 1 & 1 & 0 & 0 & \cdots & (1100)_2 & \cdots & (12)_{10} \\ \end{array} $$
$$ \begin{align*} (0011)_2 + (1001)_2 &= (1100)_2 \\ (3)_{10} + (9)_{10} &= (12)_{10} \\ \end{align*} $$
ユーリ「ふふん!」
僕「え、違うの?」
ユーリ「加算してるってのは正解でーす。 でも、 $3 + 9 = 12$ を表しているってゆーのは、半分正解でーす。 減点、減点!」
僕「え? ちょっと待った。検算する……いや、合ってるよ。ほら」
$$ \begin{align*} (0011)_2 = 0\cdot2^3 + 0\cdot2^2 + 1\cdot2^1 + 1\cdot2^0 = 2+1 = (3)_{10} \\ (1001)_2 = 1\cdot2^3 + 0\cdot2^2 + 0\cdot2^1 + 1\cdot2^0 = 8+1 = (9)_{10} \\ \end{align*} $$ユーリ「はーい、これは確かに合ってまーす。 でもね、お兄ちゃん。 $1001$ というビットパターンは $9$ を表さなきゃいけないとは決まってないのでーす」
僕「$1001$ が $9$ を表さなかったら、何を表す?」
ユーリ「$1001$ は $-7$ を表してもいいのでーす! そして $1100$ は $-4$ でもいいのでーす! ほら計算あってるう!」
ユーリの解答
これは、 $3+9=12$ の加算をしていると考えてもいいけど、 $3 + (-7) = -4$ の加算、つまり、 $3-7=-4$ の減算をしていると考えてもいい。
$$ \begin{array}{cccccrcrcrcr} 0 & 0 & 1 & 1 & \cdots & (0011)_2 & \cdots & (3)_{10} & \cdots & (3)_{10} \\ 1 & 0 & 0 & 1 & \cdots & (1001)_2 & \cdots & (9)_{10} & \cdots & (-7)_{10} \\ \hline 1 & 1 & 0 & 0 & \cdots & (1100)_2 & \cdots & (12)_{10} & \cdots & (-4)_{10} \\ \end{array} $$
$$ \begin{align*} (0011)_2 + (1001)_2 &= (1100)_2 \\ (3)_{10} + (9)_{10} &= (12)_{10} \\ (3)_{10} + (-7)_{10} &= (-4)_{10} \\ \end{align*} $$
僕「$1001$ というビットパターンが $-7$ を表す……それはどういうルールなんだ?」
ユーリ「リサ姉は表を作ってくれたよん。 $4$ ビットのビットパターンを、 符号無しで考えた場合と、符号付きで考えた場合の一覧表。これだ!」
カード2($4$ ビットのビットパターンと、整数の対応表)
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline 0000 & 0 & 0 \\ 0001 & 1 & 1 \\ 0010 & 2 & 2 \\ 0011 & 3 & 3 \\ 0100 & 4 & 4 \\ 0101 & 5 & 5 \\ 0110 & 6 & 6 \\ 0111 & 7 & 7 \\ 1000 & 8 & -8 \\ 1001 & 9 & -7 \\ 1010 & 10 & -6 \\ 1011 & 11 & -5 \\ 1100 & 12 & -4 \\ 1101 & 13 & -3 \\ 1110 & 14 & -2 \\ 1111 & 15 & -1 \\ \end{array} $$
僕「符号無しと符号付き。符号無しの方はいいけれど、 符号付きは……これは、どういうルールなんだ?」
ユーリ「ルールって?」
僕「リサちゃんがこの表をくれたんだろ? $4$ ビットのビットパターンを符号付きで表すときには、 何かルールがあるにちがいないよね」
ユーリ「あー、ま、そだね。それはさー……」
僕「いや、大丈夫。表があるんだから、考えることができる」
問題
カード2の《符号付き》は、 どういうルールでビットパターンと整数を対応付けしているのか。
ユーリ「お兄ちゃんは、いろんなとこから問題見つけんだね」
僕「……」
ユーリ「はいはい、思考モード全開中……」
僕「なるほどね。カード1に出てきた $0011, 1001, 1100$ のビットパターンを見てみるとおもしろいな」
ユーリ「何で?」
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline \vdots & \vdots & \vdots \\ 0011 & 3 & 3 \\ \vdots & \vdots & \vdots \\ 1001 & 9 & -7 \\ \vdots & \vdots & \vdots \\ 1100 & 12 & -4 \\ \vdots & \vdots & \vdots \\ \end{array} $$僕「ほら、《符号無し》の方では $3 + 9 = 12$ という加算が成り立っているけれど、 同じように《符号付き》の方でも $3 + (-7) = -4$ という加算がちゃんと成り立っている」
ユーリ「だから、そーゆー話してたんだけど」
僕「お兄ちゃんが感心しているのは、いまのような加算が、 この表のどの二つの数を使っても成り立っているということに対してなんだよ。 たとえば、 $0001$ と $1101$ で考えてみると……」
$$ \begin{array}{cccc} 0 & 0 & 0 & 1 \\ 1 & 1 & 0 & 1 \\ \hline 1 & 1 & 1 & 0 \\ \end{array} $$ユーリ「$0001$ と $1101$ で $1110$ だね」
僕「そして、カード2の表を見てみる」
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline \vdots & \vdots & \vdots \\ 0001 & 1 & 1 \\ \vdots & \vdots & \vdots \\ 1101 & 13 & -3 \\ 1110 & 14 & -2 \\ \vdots & \vdots & \vdots \\ \end{array} $$ユーリ「ふんふん」
僕「確かに、《符号無し》では $1 + 13 = 14$ が成り立ち、 《符号付き》では $1 + (-3) = -2$ が成り立っている。すごく、うまくできてる表だ」
ユーリ「リサ姉は『ただし、オーバーフローに注意』って言ってたよ。咳しながら」
僕「オーバーフロー?」
ユーリ「うん、ほら、《符号無し》だと $0$ から $15$ までしかないもん」
僕「そうか。たとえば $0001$ と $1111$ だと……」
$$ \begin{array}{ccccc} & 0 & 0 & 0 & 1 \\ & 1 & 1 & 1 & 1 \\ \hline 1 & 0 & 0 & 0 & 0 \\ \end{array} $$ユーリ「$0001$ と $1111$ で $10000$ だね」
僕「$5$ ビットになってしまうから、カード2の表には出てこない……けど、下の $4$ ビットだけなら意味はあるなあ」
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline 0000 & 0 & 0 \\ 0001 & 1 & 1 \\ \vdots & \vdots & \vdots \\ 1111 & 15 & -1 \\ \end{array} $$ユーリ「意味って?」
僕「ほら、 $0001$ と $1111$ で、 $10000$ になるとして、下の $4$ ビットだけ……つまり $0000$ を考える。 そうすると、《符号無し》の方だと $1 + 15 = 0$ となって変になるけど、 《符号付き》の方は $1 + (-1) = 0$ となって、ちゃんと理屈に合ってる」
ユーリ「そだね」
僕「いや、両方とも理屈に合ってる! 《$16$ で割った余り》を考えればいいんだ。 $4$ ビットで考えてるんだから当然か!」
ユーリ「$16$ で割った余り?」
僕「そうだよ。 $1 + 15 = 16$ だけど、 $16$ で割った余りを考えれば $1 + 15$ は $0$ だと言える。 $16$ を $16$ で割った余りは $0$ だから。 $$ 1 + 15 \equiv 0 \pmod{16} $$ ということだよ」
ユーリ「《符号無し》はいいんだけど、《符号付き》の方はどうなったの?」
僕「うん、たぶん、数式で表せると思うよ。 $0000$ から $0111$ までは《符号無し》と《符号付き》は同じ対応関係だよね」
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline 0000 & 0 & 0 \\ 0001 & 1 & 1 \\ 0010 & 2 & 2 \\ 0011 & 3 & 3 \\ 0100 & 4 & 4 \\ 0101 & 5 & 5 \\ 0110 & 6 & 6 \\ 0111 & 7 & 7 \\ \end{array} $$ユーリ「そだね」
僕「だから、問題は、左端のビットが $1$ のときのルールだ」
$$ \begin{array}{rrr} \REMTEXT{ビットパターン} & \REMTEXT{符号無し} & \REMTEXT{符号付き} \\ \hline 1000 & 8 & -8 \\ 1001 & 9 & -7 \\ 1010 & 10 & -6 \\ 1011 & 11 & -5 \\ 1100 & 12 & -4 \\ 1101 & 13 & -3 \\ 1110 & 14 & -2 \\ 1111 & 15 & -1 \\ \end{array} $$ユーリ「……」
無料で「試し読み」できるのはここまでです。 この続きをお読みになるには「読み放題プラン」へのご参加が必要です。
ひと月500円で「読み放題プラン」へご参加いただきますと、 440本すべての記事が読み放題になりますので、 ぜひ、ご参加ください。
参加済みの方/すぐに参加したい方はこちら
結城浩のメンバーシップで参加 結城浩のpixivFANBOXで参加(2015年2月20日)
この記事は『数学ガールの秘密ノート/ビットとバイナリー』として書籍化されています。
書籍化にあたっては、加筆修正をたくさん行い、 練習問題や研究問題も追加しました。
どの巻からでも読み始められますので、 ぜひどうぞ!