数学・算数の2進数。まったく理解できない。Ruby 1 はじめてのプログラミング (CD-ROM付) (プログラミング学習シリーズ)をやっている途中に出てくる2進数を自分なりに分解して指先で覚える事にしました。
<よういするもの>
- A4コピー用紙
- ゼムクリップ(おはじきでも何でも可)
1. まず、A4コピー用紙に以下の様に丸を書きます。一つの丸は2進数の一桁を表します。この丸の中にクリップがある=1、ない=0となります。
2. 2進数なので、それぞれの丸内にはクリップを置く事のできる数量に制限があります。
3. ひと桁目は、クリップ1個まで置けます。2つめの丸、すなわち2桁目は2個まで置けます。3桁目は4個まで、4桁目は8個、5桁目は16個まで・・・。と丸の下辺りに書いておくと分かり易い。
4. クリップを1個、一桁目の丸に置いてみます。一桁目の丸にはクリップを1個まで置けるのでそのまま置けます。この時、2進数の「1」となります。
5. 「1」は十進数でも「1」なのでいいんですが、次が問題です。クリップ2つめを何処に置くか?2進数には”2”という桁は存在しないため(一番右の丸には2個置くというルールは存在しないため)クリップが2つになったとたん1桁目の丸には2つとも置けなくなって桁上がりが発生します。これは2進数の決めごとです。
”2個のクリップ全部”「2桁目」の桁へ持って行きます。操作は常に「ワンアクション」です。前の1個のクリップを2桁目へ押し出してから2つめのクリップを移動・・・、とか2アクションはやりません。2アクションをやったら2進数の概念は崩れ去ります。
2つめのクリップは一桁目には置けない→ワンアクションで2桁目に置く、一桁目に元々あったクリップは桁あふれした瞬間、そこに居られなくなるので即時同時に2桁目に移動。これを同時にやっていると考えます。
6. これで十進数の「2」は2進数「10(イチゼロ)」になりました。
7. 次は十進数「3」です。クリップ3個目は、そのまま1桁目に置けます。桁あふれも発生しません。これで、2進数の「11(イチイチ)」が完成
8. さらに十進「4」です。今度は桁あふれるので、ワンアクションで次の桁にクリップ大移動です。2進「100(イチゼロゼロ)」が完成
こうしてみると、各桁同じ「1」でも重みが違うな・・・。と感じます。実際に桁が上がるほどクリップの重さを増してゆくわけです。(クリップの重さが1個1gあると仮定してみて下さい、桁を増すごとに重くなり、桁が下がるごとに軽くなります)桁とは決められたクリップの個数のまとまりだと考えると考えやすくなりました。実際に紙の上にクリップを色々置いて試すと面白いです。
それじゃあ十進「65」を二進で表す事をクリップで考えた時どうなるか?これも同じように考えられます。二進のまとまりで一番65に近いのは「64個までクリップが置ける丸の中」のまとまりですから、そこに64個のクリップを置く。残った1個のクリップは「1個まで」のまとまり(一番右側の一桁目の丸)に置くと。
ここで64個までクリップが置ける丸は何桁目か?って考えると、1桁目==クリップ1個まで置ける丸、2桁目==2個までの丸、3桁目==4個までの丸、4桁目==8個までの丸だから、64までクリップが入る丸は、=7桁目に在る。よって7桁目が二進「1」になる。つまり十進「65」は二進「1000001」になる。
なんて風に考えると分かり易くなった。つまり一番多くクリップを置ける場所から探してゆく。見つかったらそこにまとめて置く。残りのクリップを次に多くまとめておけるところを探して置く、又残ったらそこに置くを繰り返すと2進数の完成。
丸のまとまりに置けるクリップの数が2の階乗になるときは「2進数」で、10の階乗になる時は「10進数」、16の階乗になる時は「16進数」と、発展的に考える事もOK。手を動かすと面白かったのでこんな風ににまとめてみました。
(2010/05/28 11:32)追記
ちょっとRuby本で2進数の小数点の話になったので、この事について実践してみる。
まずはA4のコピー用紙で以下の様に土台を作る。
今度は真ん中に小数点があり、それを境に桁もが登場。
(2010/05/29 12:40)追記
クリップの代わりに四角に切った紙切れを用意、小数点以下では1よりも小さくなるので、紙を小さく切って1よりも小さなサイズを表す。(クリップは金属製で切断できないので)1の半分が0.5=、1の半分の半分が0.25=、というように1の大きさの紙がだんだん半分ずつ小さくなる。2進数の場合、すべて「半分」という単位のコマで不思議と構成されている。
(2010/05/31 11:33)追記
の大きさの紙を1枚、の桁の丸内に置きます。これでこの丸にはこれ以上のコマは置く事が出来ません。2進数で0.00012、10進数で0.0625となります。
次に、もう一枚0.0625=2-4を置こうとしてみると、もう同じ丸には置けないので桁上がりが発生。次の丸にコマ移動して、2-3へ2枚のコマが収まります。これで、2進数0.00102が完成、10進数で2-3=0.125です。
次に、さらに一枚2-4を置く事を考えると、今度は空いている2-4の丸に一枚置けます。これで2進数で0.00112となります。同時に10進数で0.1875(0.0625の大きさのコマが3枚で0.1875)です。
同様にして、整数と同じように桁上がりを考慮してコマを正しい丸に配置すれば、2進数のできあがりです。以下表にしてみます。
2進数 | 10進数 | 0.0625のコマが何枚か | 2の階乗で表現 |
0.0001 | 0.0625 | 1枚 | |
0.0010 | 0.1250 | 2枚 | |
0.0011 | 0.1875 | 3枚 | |
0.0100 | 0.2500 | 4枚 | |
0.0101 | 0.3125 | 5枚 | |
0.0110 | 0.3750 | 6枚 | |
0.0111 | 0.4375 | 7枚 | |
0.1000 | 0.5000 | 8枚 |
(※2のマイナス1.5乗とかってあるの?わからんので”?”にしてます)
このように、2進ではちゃんと1の次は10、10の次は11…と進むが、それと対応する10進は0.0625から0.1250と飛び飛びで進む。つまり、10進の0.0625から0.1250の間、例えば0.09とかいった10進数に対応する2進数がない。(2進数の無理数になる。2進数の無理数はもうワシにはわからんのでやろうかどうしようか迷ってる)
要するに、10進数で小数点のある数が答えに出た時、2進数では、近似値で答えを出すしかない。と言う事。
これは、コンピュータの浮動小数点数の計算が近似値でしか出せないというのと繋がる。
<一応のまとめ>
小数点があっても無くても同じように2進数のルールに従ってコマが移動する。桁が上がればコマの重さは重くなるし、桁が下がれば桁のコマの重さは軽くなってゆく。それらの考え方は小数点があっても無くても変わらない。
ただし、整数では10進数と必ず対応する2進数が有ったが、小数点以下では必ずしも10進数と対応する2進数が無い(無理数に成る)
- 作者: 高橋一雄
- 出版社/メーカー: ベレ出版
- 発売日: 2005/08
- メディア: 単行本
- 購入: 40人 クリック: 995回
- この商品を含むブログ (41件) を見る
- 作者: 高橋一雄
- 出版社/メーカー: ベレ出版
- 発売日: 2010/01/22
- メディア: 単行本(ソフトカバー)
- 購入: 5人 クリック: 21回
- この商品を含むブログ (5件) を見る
- 作者: 間地秀三
- 出版社/メーカー: 明日香出版社
- 発売日: 1992/12/18
- メディア: 単行本(ソフトカバー)
- 購入: 28人 クリック: 347回
- この商品を含むブログ (13件) を見る
- 作者: 佐藤寿之
- 出版社/メーカー: 旺文社
- 発売日: 2009/02
- メディア: 単行本
- 購入: 1人 クリック: 2回
- この商品を含むブログ (1件) を見る
.