2003lk入門

トップに戻る

をクリックすると非真理設定が非表示になります。ページを再読み込みすると戻ります。


ksi.3 実践

lexn.0 大小比較と桁の移動

[第3章](ksi. 3)では、今まで学んだ命令を応用して様々な処理を書いていきます。ただし、その前に、数がスイッチ列で扱われていることに依存する便利な命令を学んでいきましょう。


ksi.2のlexn.5fimalkRzについて学びましたが、そこで学んだのは数が等しいかどうか判定するための命令だけでした。数が等しいかどうかを判定するのは簡単です。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と解釈する方の命令の方が短く書けるようになっています。例えば、f0f1を比較するには、次のように書きます。

 意味  命令
 [もしf0f1以下なら](fi f0 es f1 xut loler)  fi f0 f1 xtlo 
 [もしf0f1未満なら](fi f0 es f1 xy loler)  fi f0 f1 xylo 
 [もしf0f1以上なら](fi f0 es f1 xo loler)  fi f0 f1 xolo 
 [もしf0f1を超えるなら](fi f0 es f1 le loler)  fi f0 f1 llo 

一方、左端のスイッチの価値を2147483648と解釈する命令については、[負でない](ny snakxaz)を略したnysxtloxyloなどの末尾に付けます。つまり、fi f3 f0 llonysfi 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と書きます。


トップへ   次のページへ