【マイクロビット入門】(18)2進数、10進数、16進数

マイクロビット

 タイトルに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進数
00
11
210
311
4100
5101
6110
7111
81000
91001
101010
111011
121100

 どんどん桁が増えていきますね。

 ここで気を付けないといけないのだが、2進数の「10」は10進数では「2」で、10進数の「10」とは表している値が異なる。

 確かに、紛らわしいですね。

 そのため、2進数で表記する場合は「0b0010」や「0b00000010」というように表記したりする。

 ムムム、これはいったい・・・

 最初の「0b」が2進数であることを表しており、残りの「0010」や「00000010」が「10」を表しているのだ。数字の数が4の倍数になるように0を追加するのが一般的だ。

 では、この書き方で15まで数えてみると・・・

10進数2進数
00b0000
10b0001
20b0010
30b0011
40b0100
50b0101
60b0110
70b0111
80b1000
90b1001
100b1010
110b1011
120b1100
130b1101
140b1110
150b1111

 で良いですか?

 ウム、その通りなのだ!

「16進数」も見てみよう

 次は16進数だ。16進数の場合は16種類の数字を使って・・・

 ちょっと待ってください!数字は「0」から「9」の10種類しかないですよ!

 ウム!なので、足りない分はアルファベットを使うのだ。

10進数16進数
10A
11B
12C
13D
14E
15F

 「0」から「F」まで数えたら、次は「10」となるのですか?

 その通りだ。わかってきたようだね。ちなみに16進数の場合は、10進数と区別するために、例えば「0x」をつけて「0x0C」などと表記したりする。

 数字の数が2の倍数になるように0を追加するのですね?

 イェ~ス!16まで数えてみよう。

10進数16進数2進数
00x000b00000000
10x010b00000001
20x020b00000010
30x030b00000011
40x040b00000100
50x050b00000101
60x060b00000110
70x070b00000111
80x080b00001000
90x090b00001001
100x0A0b00001010
110x0B0b00001011
120x0C0b00001100
130x0D0b00001101
140x0E0b00001110
150x0F0b00001111
160x100b00010000

 なるほど~

プログラムの中で使ってみよう。

 次はマイクロビットのプログラムですね。

 ウム。実際にプログラムの中に「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進数に変換することができる。

 次回もお楽しみに!

コメント

タイトルとURLをコピーしました