→をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。
[第3章](ksi. 3)では、今まで学んだ命令を応用して様々な処理を書いていきます。ただし、その前に、数がスイッチ列で扱われていることに依存する便利な命令を学んでいきましょう。
ksi.2のlexn.5でfi
とmalkRz
について学びましたが、そこで学んだのは数が等しいかどうか判定するための命令だけでした。数が等しいかどうかを判定するのは簡単です。32個の[スイッチ](lysol)が全て一致していれば等しく、そうでなければ異なるのですから。
さて、問題は大小判定をするときです。ksi.1のlexn.1で述べたとおり、右端のスイッチの価値を1、その左を2、そのさらに左を4、というふうに決めていくと、32個のスイッチで0から4294967295までの数を扱うことができ、左端のスイッチの価値を2147483648ではなく-2147483648と解釈してあげると、-2147483648から2147483647までの数を扱うことができるようになります。つまり、左端のスイッチの価値には2通りの解釈があります。
既に述べたとおり、足し算や引き算を行っている限りでは
11111111111111111111111111110100 → -12 + 00000000000000000000000000011101 → 29 100000000000000000000000000010001 → 17 11111111111111111111111111110100 → 4294967284 + 00000000000000000000000000011101 → 29 100000000000000000000000000010001 → 4294967313 = 17 (4294967296を周期として同一視するので)
のように、どちらを用いても一貫した処理ができますが、大小比較に関してはそうではありません。29は-12より大きく、4294967284よりも小さいわけですが、この2つの数の違いは2003lkにとっては左端のスイッチの価値をどう解釈するかに過ぎないのですから。
ということで、どちらの解釈を使ってほしいかによって使う命令が変わってきます。とはいえ、我々の日常では4294967284よりも-12の方が登場頻度が高いため、左端のスイッチの価値を-2147483648と解釈する方の命令の方が短く書けるようになっています。例えば、f0
とf1
を比較するには、次のように書きます。
意味 | 命令 |
[もしf0 がf1 以下なら](fi f0 es f1 xut loler) |
fi f0 f1 xtlo |
[もしf0 がf1 未満なら](fi f0 es f1 xy loler) |
fi f0 f1 xylo |
[もしf0 がf1 以上なら](fi f0 es f1 xo loler) |
fi f0 f1 xolo |
[もしf0 がf1 を超えるなら](fi f0 es f1 le loler) |
fi f0 f1 llo |
一方、左端のスイッチの価値を2147483648と解釈する命令については、[負でない](ny snakxaz)を略したnys
をxtlo
やxylo
などの末尾に付けます。つまり、fi f3 f0 llonys
やfi f2 f1 xolonys
などとなります。
次に、「一つ左のスイッチは価値が二倍」という性質を利用した、「桁を[動かす](dusnij)」という演算について考えていきましょう。
仕組みは簡単です。一つ左のスイッチは価値が二倍なのですから、全ての桁を一つ左にずらして一番下の桁にゼロを入れれば、数が二倍になるのです。
00000000000000000000000000011101 → 29 00000000000000000000000000111010 → 58 00000000000000000000000001110100 → 116
この性質は、負の数に関しても上手く成り立ちます。というのも、-6は6を足したときに0になるようなスイッチ列なのですから、それを二倍すると(「6を足したときに0」と「6を足したときに0」の和ですから)「12を足したときに0」という性質を持つスイッチ列となるのです。
11111111111111111111111111111010 → -6 11111111111111111111111111110100 → -12 11111111111111111111111111101000 → -24
2003lkでの表記法ですが、f2
を3桁[左へ移動させる](dusnij Restutonj)には、dRo 3 f2
と書きます。
さて、ということは、この操作を逆にすれば数を半分にしたり四分の一にしたりできるわけです。ところが、ここでは前述の「解釈の差」が効いてきます。
まず、左端のスイッチが0のとき。このときはどちらの解釈でも値は変わらないので、先程のを逆転させて
00000000000000000000000001110100 → 116 00000000000000000000000000111010 → 58 00000000000000000000000000011101 → 29
と「右にずらし、左端には0を入れる」とすることで半分にできます。一方、左端のスイッチが1のときには話が変わってきます。まず、左端のスイッチの価値を2147483648と解釈するとき。
11111111111111111111111111110100 → 4294967284 01111111111111111111111111111010 → 2147483642
この場合は「右にずらし、左端には0を入れる」です。一方、左端のスイッチの価値を-2147483648と解釈するときはどうでしょう?
11111111111111111111111111110100 → -12 11111111111111111111111111111010 → -6 11111111111111111111111111111101 → -3
このように、「右にずらし、左端には1を入れる」ことで半分にできます。
ということで、
ということが分かります。
前者の命令は[左へ移動させる](dusnij Restutonj)命令であるdRo
の真逆なので、[右へ移動させる](dusnij tesnokonj)を略したdto
と書きます。一方、後者はsnakxazasykを処理するためのものなので、dtosna
と書きます。