歩く2進数

 たしか小学生の頃だったと思うが、ロボット作りに熱中していたことがある。このロボットとはアニメに出てくるような見栄えのするプラモデルではなく、リモートコントロールできる動力内蔵の不格好な代物だった(しかも画用紙や段ボールで作るのだ)。
 最初の目標は、歩行させることだった。当時の私には歩行という行動が、絶妙なバランス制御によって成り立っているという生命の驚異など当然わかるはずもなく、足の関節のつながりを再現できれば実現できると単純に考えていた(ロボットによる歩行は現在の技術でも大変困難な課題である。恐れを知らぬ無知とはまさにこのことであろう)。
 さて、足の関節はどれだけ動けばよいのか。まず股の部分だが、前後方向と左右、それから太ももを軸としてねじることもできる。つまり3方向に動くということだが、これを自由度3ともいう。次にひざだ。ここの運動は前後方向だけなので自由度は1。最後に足首だが、前後方向と内側にだけだが左右、ねじりもあるから自由度は3だ。つまり、足1本で自由度は合計7ということになる。
 可動部分が7箇所なのだから、動力も7箇所必要になる。動力にはマブチモーター(商品名である。工作する小学生の味方だ)を7個使用する。このモーターは、当然ながら電動なので+と−の2本の電線で電気を供給して動かすわけだが、7個のモーターを制御するためなら14本の電線が必要になる計算だ。
 ここでまだ知恵の足りない小学生の私でも、大量の電線を束ねてつながなくてはならないことに気が付いた。片足で14本、両足なら28本だ。この調子で全身を作ったら数十個のモーターが必要になり、そしてそれらのモーターを制御するための電線はものすごい本数になり、束ねるとホースではないかと思えるほどの太さになるだろう。さらにそれらのモーターはスイッチの入り切りで制御するのだから、モーターと同じ数のスイッチが必要なのだ(7個のスイッチを操作しても、やっと片足だけなのだ)。
 こうして無念にも諦めることになったわけだが、その後ある工作本で「マイコン制御で多数のモーターや電球を動かそう!」といったような趣旨の記事を目にした(マイコンとはマイクロコンピュータの略である。念のため)。なんと、数本の電線でたくさんのモーターを制御する方法があるではないか! その秘密を知りたくて買おうとしたのだが、当時の私の小遣いでは到底手の出る金額ではなかった(たしか8,000円程度だった)。だが、このために私の脳には「コンピュータ」という焼印が押されてしまったのである。
 ここ数年、「マイコン制御」ではない工業製品を見かけることが少なくなった。掃除機、炊飯器などのさまざまな家電製品、さらには自動車さえも今や「マイコン制御」だが、これらの仕組みは冒頭の工作本の記事に出てきたものと原理的には変わらない。少ない電線でたくさんの機器を動かす秘密は、2進数と呼ばれる数をコンピュータが利用しているところにある。
 2進数とは、0と1しかない数の体系である。これに対して我々が普段利用しているのは10進数である。10進数は0から9までの記号を用いて数をあらわす。9の次の記号は無いので、桁が1つ繰り上がって10となる。10の次は1の位が空いているので11になる。これも19までいくと1の位がまた、次の記号がなくなったので10の位を1増やすことになり20となる。この調子で進むと、99に達した時点でどこも増やせなくなる。よってさらに桁が1つ繰り上がって100になるというわけだ。
 聡明な読者諸君には、なにをわかりきったことをと、いささか不愉快かもしれないが、これは10進数だけの神秘ではない。2進数もまた、同じ仕組みで成り立っているのだ。
 2進数は先に書いた通り、0と1の2つの記号しか使わない。したがって0からスタートすると次の数は1(当然だ)。だが、その次はもう使える記号がないのだ(とにかく0と1だけだ)。最後の記号に辿り着いたらどうするのか? 10進数では桁を1つ繰り上げた。2進数も同じである。よって、10(ジュウと読んではいけない。イチゼロと読むのだ)となる。その次は11(無論、イチイチと読む)、さらにその次はまたもや行き詰まりなので1桁繰り上がって100である。まだ、少し分かりにくいと思うので、10進数と2進数の対照表を次に示そう。
10進数 2進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
 このように、2進数とはひたすら0と1だけで成り立っている数なのだ。直感的にわかりにくく、10進数に比べて桁数がすぐに大きくなってしまう。なんと不条理な数だろうと思われるかもしれないが、その不条理な仕組みをよりどころとしているのがコンピュータである。では、なぜコンピュータにとっては不条理ではないのか?
 ここで、冒頭のロボットの話に戻ろう。関節に用いるモーターはスイッチで入り切りすることで制御するはずだった。スイッチの入り切り、つまり動くか止まるか、これを「動く=1」、「止まる=0」と表現してみたらどうか(註1)。これならスイッチの入り切りは0と1の数の並び(数列と呼ぶ)で表すことができる。片足でモーター7個だからスイッチも7個、数列も7桁あればよい。両足でスイッチ14個だから数列も14桁。両足の動きは14桁の2進数の繰り返しに置き換えることができるわけだ。だが、これだけでは工作本の記事のように、数本の電線でモーターを制御できることにはならない。
 次なる解決案を説明するためにまず、プッシュホンを思い浮かべていただきたい。プッシュホンには0から9と#、*のボタンが付いているが、ここで利用するのは0と1のボタンだけにする。このプッシュホンを利用して一方の側からもう一方の側に前出の14桁の2進数の数列を伝えるという通信実験を考えてみよう。最初に、伝えたい数列が「0010001111101」だったとする。そして互いに受話器を手にとり、伝える側がこの数列の通りにボタンを押してみよう。相手には「ピッピッポッピッピッピッポッポッポッポッポッピッポッ」と聞こえるだろう。相手はこの連続した音を「ピッ=0」、「ポッ=1」と解釈するとみごと「0010001111101」となるではないか。これと同じ仕組みをロボットとリモコンの間に応用するのである。
 無論、ロボットとリモコンにそれぞれプッシュホンを取付けるわけではないが、原理は同じである。つまり、2進数で表される数列を1桁ずつ順番に相手側に送り込み、受け取る側では受け取った順に数を並べていく。双方のタイミングが一致していれば送り出した数列と同じ数列を受信側で得られる。0と1の実際の表現は電気のパルスを用いる。パルスがなければ0、あれば1という具合にである。この方法なら電線(註2)は1本あればよい。なんとスマートな方法ではないか。
 実際のコンピュータでは、電線を必要なだけ束ねる方法と、1本にして並べ変えた数列を送る方法を、それぞれ「パラレル・インターフェース」と「シリアル・インターフェース」と呼び、ともに数多く利用されている(註3)。だが、どちらの方法も2進数の利用が大前提である。
 さて、我らが愛しのロボットが歩きだすとき、その両足の動きの一瞬を切り取ると、それは14桁の2進数の数列で表わされることがわかった。そしてこの14桁の数列の連続が、「歩く」という複雑な動作(の一部)を数字に置き換えたものとなるのだ。
 ついに我々は、人間の動きを数理的モデルに変換するという偉業に達するための手段を手に入れたのである!
 最後に(大変不本意だが)、当時の私がこの偉業の達成に全く至らなかったことをここに白状しておこう(私もやはりただの子供だったということだ)。

(註1)実は戻るという動きも必要なのだが、話を単純にするためにここでは無視することにする。したがって、実際に必要な数列の桁数も14桁以上になるが原理は同じである。
(註2)正確には信号線。信号線にはグランド線がペアで必要なので実際には2本になる。
(註3)パラレルとシリアルの詳しい説明は後のエッセイで取り上げるつもりである。