テレビのアニメはどこから来る? / 第95話

第95話:イトは、下書き二件を一つのbitへ押し込んだ|0と1でいくつ表せる?

ピコルート第95話。下書き二件を一つのbitで数えようとしたら、一件と同じ表示になった。0と1、二bitの四pattern、10を2と読む約束を分けます。

二進数0と1ビットデータ10分更新

第94話のlogout receiptが、lab奥のstate encoderへ入った。

cookie present   0
session active   0
account exists   1
draft count      2

イトは最初の三stateを、三枚のbit cardへ移した。

dark、dark、light。

残ったdraft count 2にも、同じ一枚を置く。

「下書きがあるなら、1でいいよね」

one-bit count leverを倒すと、restore previewが止まった。

actual server drafts       2
encoded draft count        1
restore slots requested    1
unlisted draft             1

一件ある状態と、二件ある状態が、同じlightへ押し込まれていた。

下書きは消えていない。

でも二件目を運ぶslotが、previewに出てこない。

「1は“ある”だけで、“一件”とは限らないんだ」

イトはleverを戻した。

bitは、0か1を表す一桁

bitはbinary digit。

一つのbitが表すvalueは、0または1だ。

one bit
0
1

だから一bitのpatternは二通りしかない。

0 = 下書きなし、1 = 下書きありと決めれば、presence fieldには使える。

でもdraft countとして0件、1件、2件を区別したいなら、二patternでは足りない。

イト

同じ1でも、“ある”と“一件”はfieldの意味が違うんだ

ユイ

valueだけでなく、何を表す欄なのかも必要なんですね

マコト

一枚の札へ意味を詰め替えたら、受け取る側にも同じschemaが要る

Picoは答えを作らない。

has_draftsのone-bit holderと、draft_countのempty railを別々のinspection lightで照らした。

0と1は、物理的な電源off / onだけではない

labでは、darkを0、lightを1として見せている。

実際のdigital circuitでは、voltageなどのphysical signalをvalid low / valid highとして区別する設計がある。

lowとhighの間を、いつでも安全な第三のlogical valueとして使うわけではない。

input thresholdとnoise marginを設け、多少のnoiseがあってもlow / highを取り違えにくくする。

ただしphysical implementationは一種類ではない。

charge、magnetic state、optical stateなど、何を二状態へ対応させるかはsystemによって違う。

0が必ず「電気なし」、1が必ず「電気あり」という意味でもない。

bitはlogical value。

lampは、その関係を見るためのmodelだ。

二bitなら、四patternを区別できる

イトはempty railへ、bit holderを二枚並べた。

一枚目は二pattern。

二枚目も二pattern。

組み合わせると、四patternになる。

00
01
10
11

一般に、n bitならpattern数は2^n。

二bitなら2^2 = 4だ。

今回のclosed fixtureでは、left bitの重みを2、right bitの重みを1と決める。

bits   count
00     0
01     1
10     2
11     3

10が自然界で最初から2という意味を持つわけではない。

二進数の位取りを使い、leftを2の位、rightを1の位として読むから2になる。

width、bit position、unsigned countという解釈が揃って、初めて受け取り側も同じvalueへ戻せる。

よくある誤解:0は「ない」、1は「ある」と決まっている

0と1の意味は、fieldの約束で変わる。

has_draftsなら、0をfalse、1をtrueとしてよい。

draft_countの二bit fieldなら、10をcount 2としてよい。

別のformatでは、同じ10が色、文字の一部、命令の一部かもしれない。

bit列だけを見て、意味を一つに決めない。

さらに、bit orderやfield widthを失うと、区切り方まで分からなくなる。

value only        10
needed schema     width 2 / left weight 2 / unsigned draft count

この話ではunsigned countだけを扱う。

negative number、fraction、character encodingの読み方は、それぞれ別の約束だ。

restore rehearsalまで残り24秒

二件のserver draftを、二つのtest slotへ戻すrehearsalが始まる。

残り二十四秒。

元のdraftはread-onlyに保つ。

0件、1件、2件を区別する。

今後のtest用に3件まで表せるようにする。

decoded countと実際のslot数が違えば、restoreを開始しない。

イトはone-bit leverの前へ三枚のroute cardを置いた。

イト

A。一bitの1をcount 1として使い、二件目は見なかったことにする

イト

B。half-lightを第三のvalueにして、一枚のlampへ0・1・2を入れる

イト

C。count fieldを二bitへ広げ、位取りとwidthを固定して2を10へencodeする

Aは、presenceとcountを同じschema名で扱う。

Bは、今回のbinary decoderがvalid 0 / 1として読めない中間状態を、説明なしに第三のvalueへ変える。

Cなら、四patternのうち10を使い、二件を二件のまま戻せる。

イトがone-bit pressを閉じ、two-bit railを開いた

イトは左手で、one-bit count pressのred lidを閉じた。

half-light dialにもdark lockを掛ける。

右手で、exactly two holdersのrestore-count railを開いた。

left holderをlightへ、right holderをdarkへ切り替える。

イトが一ビットへ件数を押し込む装置と中間値ダイヤルを閉じ、下書き二件を守ったまま二つのビットホルダーを開く
presenceの一bitをcountへ流用せず、二bitの10でdraft二件を区別する。

イトはschema cardをrailのreaderへ差し込んだ。

field             draft_count
width             2 bits
interpretation    unsigned count
left weight       2
right weight      1
encoded           10

Picoはtwo-bit holdersとschema readerの境界だけを照らす。

holder、draft、slot、readerへ触れない。

10をdecodeすると、二つのslotが開いた

readerはleft lightを2、right darkを0として足した。

decoded draft count       2
actual server drafts      2
restore slots requested   2
count / slot mismatch     0

二つのtest slotが開いた。

イトはdraft一件目をslot oneへ、二件目をslot twoへ送った。

draft one restored    1
draft two restored    1
source drafts changed 0
unlisted draft        0

一bit previewで隠れた二件目が、今度は別のslotへ着地した。

イトは二つのdraft coverを順に開き、内容が違うことを確かめた。

「“ある”じゃなくて、“二件ある”まで戻せた」

ただしfieldは一bitから二bitへ増えた。

保存や送信に必要なbit数も、そのfieldだけ一bit増える。

そして二bit unsigned countの最大は3だ。

四件目を表すには、三bit以上へ広げるか、別のencodingが要る。

bit数を決める確認順

最初に、区別したいvalueを数える。

yes / noの二valueなら、一bitで足りる。

0 / 1 / 2 / 3の四valueなら、二bitで足りる。

0から4までの五valueなら、二bitでは足りず、最低三bitが要る。

次にschemaを固定する。

field name。

width。

bit orderとposition weight。

unsigned / signedなどのinterpretation。

不足valueや範囲外valueを受けたときの扱い。

最後にboundaryをtestする。

今回なら0、1、2、3をencode / decodeし、4をsilentに0へ戻したり切り捨てたりしない。

表示されたbit列だけで終わらず、decoded valueと実物の件数を比べる。

presence fieldをcount fieldへ変えるなら、名前を変えずに意味だけ差し替えない。

古いreaderが残る場合はschema versionやmigrationも必要になる。

二bitは正しかったのに、draftが動かない

restore rehearsalは成功した。

イトは本番用のdata railへ、10とschema cardを置いた。

decoderは二件と読んだ。

でもdraft carrierは、一ミリも動かなかった。

data decoded          2
operation selected    none
instruction started  0

「二件って分かったのに、どうして運ばないの?」

Picoは答えず、labの先にある新しいdoorを照らした。

doorの向こうで、細いbelt conveyorが動き始める。

data cardの隣を、別のinstruction cardが通り過ぎた。

valueを表すbitsと、何をするかを指示するbitsは、同じ役ではない。

イトはdata railのstart leverへ伸ばした手を止め、instruction slotを開いた。

次回、ピコルート第96話。

イトは、二件と数えられたのに一件も運べない?|CPUと命令の工房

この物語を、解説で深める

第95話で生まれた疑問を、解説記事で少し深く見ていきます。物語で感じた不思議さを残したまま、言葉と仕組みを順番に整理しましょう。

コンピューターはなぜ0と1を使う?二進数と二つの状態の仕組みを読む