負の整数を使いたい場合、-32768から32767の範囲になります。次のような関数で符号なし(0..65535)と符号あり(-32768..32767)を相互変換できます。
def u2i(u16%) ' 符号なしから符号ありに変換
return ((u16%+32768) and 65535)-32768
end
def i2u(i16%) '符号ありから符号なしに変換
retrun i16% and 65535
end
符号ありの整数 k を文字列に入れる場合
a$[i] = chr$(i2u(k))
それを読む場合
k = u2i(asc(a$[i]))
とします。
混乱してきたかな???
なるほど。
ただ、整数配列にすると現実コードが相当遅くなりますね~。特に書くとき。「配列読んで and して or して配列書く」になるので・・考えただけで遅そう・・・
保存データが大きくなったり時間がかかったりするのは特に問題ないと思います。公開ファイルについてくるわけでもないし、プレイヤーの意思で保存するのだろうし。
小さければファイルi/oだけ整数配列にするという手段もありますが、巨大な文字列だと無理っぽいですね。
and や or は表で覚えてください。まず x and y。x が 0 か 1, y が 0 か 1 の全ての組み合わせを考えます。
x|y|x and y
-+-+-------
0|0|0
0|1|0
1|0|0
1|1|1
x が 1 かつ y が 1 の時だけ x and y も 1 になります。掛け算そのものですね。and が論理積と呼ばれるゆえんです。or も同様に表にします。
x|y|x or y
-+-+-------
0|0|0
0|1|1
1|0|1
1|1|1
x または y のいずれかが1なら x or y も1になります。算数の和とは少し違いますが、これを以て論理和といいます。
ここまで何も難しい事はないですね。ここで 4 桁の「整数」 a b について考えます。
a=1100
b=1010
この時 a and b や a or b はどうなるの? これについては、理屈ではなくて、定義によって次のように決まっています。
多桁の場合 a and b, a or b は、各桁について独立に先ほどの表の通りに演算します。繰り上がりはしません。
______a|1100
______b|1010
a and b|1000
_____a|1100
_____b|1010
a or b|1110
ここも特に難しい所はないですよね。
button() は押されている全てのボタンの桁を1にして返します。A と B が押されてたら
00010000 (=#A)と
00100000 (=#B)を合わせて
00110000 (=#A or #B) を返します。(おっと!! さりげなく or が出てきた!!)
例えば A と B と←と↑が押されてたら
00110101 が返ります。(=#A or #B or #LEFT or #UP)
では、この時、A が押されてるかどうかを調べるにはどうすればいいでしょう?
>(button() and 10001)==10001
うー、これ苦手なやつです(^^;)
プログラムの勉強するときに、一番最初に前作の初心者講座を見たのですが、そこにボタンは『button and 16』と覚えればいいといったようなことが書いてあって、なるほどそうなのかと思っていたら、ミーバースでどなたかがそれじゃダメだ、==が云々~と言っているのを見かけて、え?==?と訳がわからなくなってしまって……。
えーと、頭から分解して考えていくと、『(button() and 10001)で↑とAが押されているかを調べている。
戻り値は00000か、00001か、10000か、10001。
他のボタンも押されていたとしても、and 10001で調べているから、他の値は帰ってこない。
で、両方押されていたら~と条件付けしたいので、==10001としている』であってます?
ーつづくー
x,y (x,yは0か1) を与えると0か1を返す関数 f(x,y) の種類一覧です。
x|y|0123456789abcdef <-- この番号で説明します。
-+-+----------------
0|0|0000000011111111
0|1|0000111100001111
1|0|0011001100110011
1|1|0101010101010101
0: 0 (x xor y)
1: x and y
2: x > y
3: x
4: x < y
5: y
6: x xor y (x != y)
7: x or y
x|y|0123456789abcdef <-- この番号で説明します。
-+-+----------------
0|0|0000000011111111
0|1|0000111100001111
1|0|0011001100110011
1|1|0101010101010101
8: x nor y (not (x or y))
9: x == y (not (x xor y))
a: not y
b: x >= y
c: not x
d: x ⇒ y (x ならば y) (x <= y) (x imp y)
e: x nand y (not (x and y))
f: 1
CPUの中では何でも bit の塊(bitの並び、bit列)として扱ってるのはいいですか?
整数も浮動小数点小数も文字もプログラムも画像も音声もみんな bit の塊。
よくコンピュータは二進数しかわからない、とか言うけど、二進数で表すと便利なことがあるってだけで、本質的に二進数であるという意味ではありません。
bit列、01の塊と言った方が実情にあってる。
あるbit列は数値を表すし、あるbit列は文字を表す、音声を表すといった具合です。
そのbit列を使う人(プログラム)が、このデータは数値だ文字だと解釈し、一貫してそのように扱うことで、同じbit列がいろんな物を表現できるのです。
表全部覚える必要なくて、論理演算というと and, or, xor あたりが有名だけど、それらはこの16種類のなかの一つですよってことです。
訂正一つ
×and, or, xor にもいくつかは名前が付いてますね。
○and, or, xor 以外にもいくつかは名前が付いてますね。
c: not x は、x=0の時 1, x=1の時0になります。yは関係ないです。
>nand で全部表せる
例えば
x and y ⇔ (x nand y) nand (x nand y)
not x ⇔ x nand x
x or y ⇔ (x nand x) nand (y nand y)
頭の体操みたいですが、他のものも nand だけで作れるかチャレンジしてみて。