タイトルに2進数とか16進数とか書いてありますが、マイクロビットと何か関係があるのですか?
いきなり切り込んできたね。ではまず、マイクロビットには、外に回路を追加して動かすことができるのは覚えているかい?
飛行機のプロペラを回したりしましたね!
ウム!飛行機のプロペラでは、出来上がったモーター駆動回路を追加したけど、自分で回路を作って追加することもできるのだ。その時に2進数とか16進数の知識が役に立つのだ。
難しそうですけど、役に立つなら頑張ります!
2進数、10進数、16進数とは?
まずは10進数を見てみよう。
いきなりだが、このお皿の上にあるプチトマトの数を数えてみてくれないかい?
1,2,3,4・・・全部で12個ありました!
ウム。プチトマトが12個あるね。ここで、「12」という数字を見てみよう。「12」という数字は、1の位と10の位が組み合わさっているね。
???1の位が「2」で、10の位が「1」ということですか?
その通り。察しが良いね。このように、普段我々が数を数えるときは、「0」から「9」までの10種類の数字を使う。
フムフム。
数字を9まで数えた後、次の数字を数えるときは、10の位を1つ増やし、1の位は0に戻して「10」となる。このように、10個数えるごとに上の位が1増える数字の表し方を「10進数」という。
なんか、当たり前のことを言っているような・・・
「2進数」とは?
では、10進数を踏まえて、2進数がどうなるか予想できるかな?
10進数では、10種類の数字を使っているので、2進数では数字を2種類使うとか・・・
おお、いいね。それで、それで???
2まで数えたら10の位が1増えて、1の位が0に戻る。???どういうこと???
では、実際に数えてみよう。
0,1,2,・・・なんか難しいぞ。・・・10,11・・・あれ???
あれ、「0」と「1」と「2」で、数字を3種類使っているね。
あ、そうか。それでは、0,1,・・・(ここで10の位が増えるのか)・・・10,11
ウム、その通り!
この次はどうなるのですか?
100の位が1増えて、100となる。そして、101,110,111,1000と続くのだ。0から12まで数えてみよう。
10進数 | 2進数 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
どんどん桁が増えていきますね。
ここで気を付けないといけないのだが、2進数の「10」は10進数では「2」で、10進数の「10」とは表している値が異なる。
確かに、紛らわしいですね。
そのため、2進数で表記する場合は「0b0010」や「0b00000010」というように表記したりする。
ムムム、これはいったい・・・
最初の「0b」が2進数であることを表しており、残りの「0010」や「00000010」が「10」を表しているのだ。数字の数が4の倍数になるように0を追加するのが一般的だ。
では、この書き方で15まで数えてみると・・・
10進数 | 2進数 |
0 | 0b0000 |
1 | 0b0001 |
2 | 0b0010 |
3 | 0b0011 |
4 | 0b0100 |
5 | 0b0101 |
6 | 0b0110 |
7 | 0b0111 |
8 | 0b1000 |
9 | 0b1001 |
10 | 0b1010 |
11 | 0b1011 |
12 | 0b1100 |
13 | 0b1101 |
14 | 0b1110 |
15 | 0b1111 |
で良いですか?
ウム、その通りなのだ!
「16進数」も見てみよう
次は16進数だ。16進数の場合は16種類の数字を使って・・・
ちょっと待ってください!数字は「0」から「9」の10種類しかないですよ!
ウム!なので、足りない分はアルファベットを使うのだ。
10進数 | 16進数 |
10 | A |
11 | B |
12 | C |
13 | D |
14 | E |
15 | F |
「0」から「F」まで数えたら、次は「10」となるのですか?
その通りだ。わかってきたようだね。ちなみに16進数の場合は、10進数と区別するために、例えば「0x」をつけて「0x0C」などと表記したりする。
数字の数が2の倍数になるように0を追加するのですね?
イェ~ス!16まで数えてみよう。
10進数 | 16進数 | 2進数 |
0 | 0x00 | 0b00000000 |
1 | 0x01 | 0b00000001 |
2 | 0x02 | 0b00000010 |
3 | 0x03 | 0b00000011 |
4 | 0x04 | 0b00000100 |
5 | 0x05 | 0b00000101 |
6 | 0x06 | 0b00000110 |
7 | 0x07 | 0b00000111 |
8 | 0x08 | 0b00001000 |
9 | 0x09 | 0b00001001 |
10 | 0x0A | 0b00001010 |
11 | 0x0B | 0b00001011 |
12 | 0x0C | 0b00001100 |
13 | 0x0D | 0b00001101 |
14 | 0x0E | 0b00001110 |
15 | 0x0F | 0b00001111 |
16 | 0x10 | 0b00010000 |
なるほど~
プログラムの中で使ってみよう。
次はマイクロビットのプログラムですね。
ウム。実際にプログラムの中に「0x0C」、「0b00001100」などを書いて、どうなるかを見てみようと思う。
どちらも10進数の「12」ですね。
直接数値を書き込んでみよう。
初めに、display.show()文の中に直接値を書いてみよう。次のようなプログラムを作ったのだ。
プログラム1
- 1行目 from microbit import *
- 2行目
- 3行目 while True:
- 4行目 if button_a.is_pressed():
- 5行目 display.show(0x0C)
- 6行目 elif button_b.is_pressed():
- 7行目 display.show(0b00001100)
- 8行目 else:
- 9行目 display.clear()
5行目で16進数、7行目で2進数が書かれていますね。
8行目、9行目で、ボタンが押されていないときには表示が消えるようにしてあるのだ。
では、動かしてみます。aボタンを押すと・・・12が、bボタンを押しても12が表示されました。
「0x0C」、「0b00001100」のどちらも値は12なので、12が表示されるのだ。
変数に入れてみよう。
次は、「0x0C」、「0b00001100」を変数に入れてみよう。次のプログラムだ。
プログラム2
- 1行目 from microbit import *
- 2行目
- 3行目 a = 0x0C
- 4行目 b = 0b00001100
- 5行目
- 6行目 while True:
- 7行目 if button_a.is_pressed():
- 8行目 display.show(a)
- 9行目 elif button_b.is_pressed():
- 10行目 display.show(b)
- 11行目 else:
- 12行目 display.clear()
3行目、4行目で16進数、2進数の値を変数「a」、「b」に入れているのですね。
8行目、10行目で、「display.show()」にこれらの変数「a」、「b」を渡しているのだ。
では、動かしてみます。今回もaボタン、bボタンのどちらを押しても12が表示されました。
「int()」関数を使ってみよう。
最後に、「int()」関数というものを使ってみようと思う。
「int()」は、何をする関数なのですか?
これは、指定された数字を10進数の値に変換する関数なのだ。例えば次のように書くのだ。
a = int(‘0x0C’, 16)
かっこの中に書いてあるのが引数でしたね。この場合は、「’0x0C’」と「16」の2つの引数が書かれていますね。
その通りだ。最初の引数には、変換したい数字を書き込む。ただし、「’」で囲って書くのがポイントだ。
「’」はシングルクオーテーションというのでしたっけ?
ウム、よく覚えていたね。「’」で囲うことで、「0x0C」などの数字が、文字の集まりとして扱われるのだ。
どういうことですか?
「0x0C」は、10進数の12を16進数で表したものだ。
フムフム。
これが「’0x0C’」となると、「0」、「x」、「0」、「c」という文字が並んだもの、という意味になり、12という値を持たなくなるのだ。「’Hello,world’」が10進数の値を持たないのと同じことなのだ。
なんと!
そのため、2番目の引数で、「’0x0C’」を何進数として扱うかを指定する必要があるのだ。では、プログラムを見てみよう。
プログラム3
- 1行目 from microbit import *
- 2行目
- 3行目 a = int(‘0x0C’,16)
- 4行目 b = int(‘0b00001100’,2)
- 5行目
- 6行目 while True:
- 7行目 if button_a.is_pressed():
- 8行目 display.show(a)
- 9行目 elif button_b.is_pressed():
- 10行目 display.show(b)
- 11行目 else:
- 12行目 display.clear()
これを動かすと・・・やっぱりaボタン、bボタンのどちらを押しても12が表示されました。
3行目、4行目は、「0x」や「0b」を省略して、次のように書いてもよいのだ。
- 3行目 a = int(‘0C’,16)
- 4行目 b = int(‘00001100’,2)
まとめ
今回のまとめで~ス
- 2進数では、「0」と「1」を使って「0b00001100」のように数字を表す。
- 16進数では、「0」~「9」の数字と「A」~「F」のアルファベットで「0x0C」のように数字を表す。
- 「int()」関数で、2進数、16進数などの数字を10進数に変換することができる。
次回もお楽しみに!
コメント