2016-08-12
コンピューターの得意技、計算と記憶。今回は「記憶」に迫ります。

オセロ盤を使った2進数アンプラグドワークショップ

記憶をどんどんシンプルにしていくと、雨かそうでないか、やったかやらなかったか、あるかないか、○か☓かなど「2つの内どちらか」という情報に行きつきます。この最小情報を表すデータ量を1bit(ビット)と呼びます。


おなじみのオセロのコマ、白を1、黒0というbitとして使ってみましょう。8x8のオセロ盤は64bitのメモリ(=記憶装置)。8bitのことを1byte(バイト)と言い換えることができるので、8byteのメモリでもあります。8Kbyte(キロバイト)の1024分の1、8Mbyte(メガバイト)の約100万分の1、8Gbyte(ギガバイト)の約10億分の1の容量ですね。

IchigoJamのCPU、LPC1114FN28/FDH28には、自由にすばやく書き換えできるRAM(ラム)と呼ばれるメモリが4KB、オセロ盤にして512コ分あります。このメモリ内に画面の状態や、文字のパターン、プログラム、計算途中の数などを記憶させ、コンピューターにどんどん書き換えさせることで、IchigoJamは動いています。

オセロ盤を使って、数を記憶させてみましょう。1とか2とか、ドットパターンで絵を描くのもあり!
でも、ひっくりかえすのが面倒なのと、桁数が増えてくると読み取りにくくなっていきますね。

ひっくり返したコマの個数で記憶するのもナイスアイデアです。
ずっと間違えにくくなりますし、0から64まで明確に表せます。
でも、もっと大きな数を記憶させることはできないでしょうか?
最大、いくつまで記憶させられるでしょう?

(時間をかけて、ここでいろいろ悩んでもらうといいです)

ビットの話を思い出してみましょう。
1bitで表せる数は0と1の2種類でした。では、2bit、2つのコマを使って表せる数は?
実は、2までではなく、0〜3の4種類いけます。00,01,10,11の4パターンあります。
では、3bitでは?4bitでは?やってみましょう!

1bit増える毎に表せるパターンは2倍になります。(普通の数値が1桁増える毎に10倍になるように)
2,4,8,16,32...8bitで256種類、16bitで65536種類、32bitで4294967295(約42億)種類...
答、オセロ盤を全部使った64bitでは、約1844京(18446744073709551616)まで記憶できます。

IchigoJamを使った2進数プラグドワークショップ

IchigoJamのメモリをいじって、自分の好きなキャラクターをゲーム画面上に登場させてみましょう!
早速、8x8にコマを敷き詰めたオセロ盤を使って絵を描きます。

bitで表す数のことを2進数と呼びます。IchigoJamやコンピューターでは8bit=1byteを基本の単位として使っています。描いた絵は1byteが8行、上から順にメモリに書き込んでいくとそのパターンをゲーム上で使うことができます。


2進数の読み方は2種類あります。1つ目は普通の数と同じように読む方法、一番右が1の位、ひとつ左が2の位、更に左が4の位で、一番左が128の位なので、その位が1の数を全部足すと読めます。例えば、10101111だと、128+32+8+4+2+1で、175となります。

もう一つの読み方は16進数を使う方法です。慣れてしまえばこっちのほうが簡単です。8bitを4bit2つに分けて読みます。10101111だと、1010と1111、それぞれ、8+2で10と8+4+2+1で15です。次に10から15をAからFに置き換えてつなげます。できた「AF」が16進数で175を表す数です。確かめてみましょう。16進数は1の位から始まって、ひとつ左は16の位。10*16+15で175です。

IchigoJamのメモリは文字のパターンからはじまっています。1文字8byteずつ256種類、2048byteの内、後ろ32コが書き換え可能です。文字コード255のパターンをのぞいてみましょう。

10 FOR I=0 TO 7 20 N=PEEK(255*8+I) 30 ?BIN$(N,8),HEX$(N,2) 40 NEXT 50 ?CHR$(255)

PEEKコマンドでメモリを1byte読みます。文字コード255のパターン8つをとりだし、2進数と16進数に変換して表示すると、イチゴパターンが表れます。

このパターンをオリジナルに書き換えてみます。

POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0

イチゴに替わって、クマムシさんが登場しました!

パターンは最大32コまでつくれます。もうひとつパターンをつくって、アニメーションさせてみます。

10 POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0 20 POKE254*8,0,#3E,#7F,#FF,#FD,#FF,#54,0 30 ?CHR$(255,LEFT);:WAIT30 40 ?CHR$(254,LEFT);:WAIT30 50 GOTO 30

ボタンを押したら歩くプログラムにしてゲームっぽくしてみます。

10 POKE255*8,0,#3E,#7F,#FF,#FD,#FF,#AA,0 20 POKE254*8,0,#3E,#7F,#FF,#FD,#FF,#54,0 30 ?CHR$(255,LEFT); 35 IF BTN()=0 GOTO 35 40 ?CHR$(254,LEFT); 45 IF BTN()=1 GOTO 45 46 ?" "; 50 GOTO 30


あるくクマムシさん動画クマムシさん

10秒ぴったりにゴールするゲーム、連打して速さを競うゲーム、障害物をジャンプするゲームとか、自分でつくったパターンでいろいろつくって自慢しよう!

参考教材
- 2しんすうをつくるBIN$(バイナリー) - IchigoJamプリント
- じぶんだけのキャラをつくる / はじめてのプログラミングその19


流れ星が見えた夜でしたが、撮影は失敗(ペルセウス座流星群ピーク

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS