第5回入門ゼミナール補足資料

5章

例えば 10 とだけ書かれていて 2 進数表記か 10 進数表記か わからない場合はどんな数値を表しているのかわからない(10進なら十だが 2進なら二).そのため, ここでは括弧の右下に数字がある場合,それが何進数表記かを示すものとする. 例えば$(1101)_2$ と書かれていれば 1101 は2進数表記であることを示し, $(13)_{10}$ と書かれていれば 13 は10進数表記であることを示す.

5.1 2進数とは

A. 10進数,2進数は表記のしかたが違うだけ.10進表記,2進表記,と 読み替えるほうがわかりやすい.

10進数が本来の数で,2進数を特殊な表現と考えてはいけない. 10のべき乗の和で表現するか2のべき乗の和で表現するかの違いにすぎない.

B. いろいろな計算方法が書かれているが基本は図5.1である. どの桁がどれだけの重みをもっているかだけを覚えておけばよい. 情報分野では2の8乗=256まで覚えておくと良い.

図5.1

図5.1 2進数表記の構造

5.2 2進数と10進数の変換

A. 2進 → 10進の変換は図5.1に従って 1 のある桁の重みを足せばいいだけである.

B. 10進 → 2進の変換のポイントは,ある位に1があるとその重みは そこより下位の位全てに1を立てて重みを合計したものよりも 大きいということである.例えば 8 の位の重み 8 は それより下の位を総動員した 4 + 2 + 1 より 1 だけ大きい. 10 進でいうと 999 に 1 を足すと 1000 になることに相当する.

これが2進の表記が一意に定まることを保証する.例えば $(77)_{10}$ を2進数表記にしたいとする.図5.1の各桁の重みをみると 128の位には大きすぎるので1を立てられないが 64の位になら立てられることがわかる.もしここで 1 を立てないと 下位の位を総動員しても 63 にしかならないので 1 を立てられる場合は 立てなければならないことがわかる.こうして上位から 1を立てられれば立てて,残り(今回の例では 77 - 64 = 13) を作るために次はどのビットを立てるか,を選んでいけばよい.

5.3 2進数の演算

A. 2進の演算は10進の筆算のやりかたで考えるとわかりやすい. 10進では数字は 0から9までなので 9 に 1 を加えるとその位を 0 にして上の桁に桁上がりで1を加える.

2進では数字が 0 から 1 までしかないだけで本質は同じである. 1 に 1 を加えたときにその位を 0 にして上の桁に桁上がりで 1を加える.

B. 減算も引く数の方が大きければ上の桁の1を借りて減算すればよいので 10進と同様に考えればよい.

C. 2 進数表記では1ビット左シフトを行うと値が 2倍になる.左の桁の重みが右の2倍になっているからである. これは 10 進で左シフトを行うと 10 倍になるのと同じことである.

教科書p.55の17,25,26,27行目と p.56の1,5,7,8,10行目,p.60の9行目の 「2の倍数」は「2のべき乗」の 誤り.10は2の倍数だがシフト単独では10倍はできない.

$10 = 2^3 +2^1$ だから 10 倍したいときは 8 倍したものと 2 倍したものを足せばよい.8 倍と 2 倍は 2 のべき乗倍なので それぞれ 3 回左シフトと 1 回左シフトで計算できるので その結果を加算すればよい.全ての整数は 2 のべき乗の和で 表せるのでこの方法で任意の乗算ができる.

5.4 論理演算

プログラミング言語で 「論理演算」というと桁上がりなしで 対応するビットごとに独立して論理演算を行う演算を指す.

論理和はどちらかが 1 であれば 1 になるので ビットの一部を強制的に 1 にする(1にマスクする)ときに 使われる.たとえば0101の下位2ビットを強制的に1にするには マスクしたい場所に1,操作しない場所に0をあてた 0011 との OR をとる. 0101 OR 0011 = 0111 となって, マスクされた下位ビット以外はもとのままになる.

論理積はどちらかが 0 であれば 0 になるので ビットの一部を強制的に 0 にする(0にマスクする)ときに 使われる.たとえば0101の下位2ビットを強制的に0にするには マスクしたい場所に0,操作しない場所に1をあてた 1100 との AND をとる. 0101 AND 1100 = 0100 となって, マスクされた下位ビット以外はもとのままになる.


Updated in June 3, 2020, Yamamoto Hirosh