足し算をするのは複数のボタンを同時に押したとき、それぞれの値をすべて反映させるためです。
ビットとは:
数の単位です。1bitで0と1の2通りを表せます(二進法)。
ちなみに8bitで1byte(バイト)となり、0~255の256通り(2の8乗)の数を表せます。ゲームでよく最大値が255になっているのはこういう理由です。
ORとは:
論理和。C = A OR B のとき、AとBの両方が0のときはC=0、ABどちらかまたは両方が1のときC=1となります。
ビット演算は他にAND、XORがあり、ANDは論理積、ビットごとの掛け算をします。つまり両方が1のときだけ答えが1となります。特定のビットが0か1か調べたり、マスクをかける(特定の部分以外を0にする)のに使います。
XORは排他的論理和というなんかムツカシイ言葉ですが、これはABが同じ値のときは0、違うときは1を返します。
従って、十字ボタン上が押された場合のBUTTON関数の返す値(戻り値)は、1と成るので、十字ボタン上が押された時に行う処理は、下記の様に記述します。
IF BUTTON(0)==1 THEN ' BUTTON(0)==#A の記述も可
'十字ボタン上が押された時に行う処理
ENDIF
単一のボタン押し下げ状態を判別する時は此れで良いですが、複数のボタンが同時に押し下げられた場合は、上記では判別出来ない事に成ります。例えば、十字ボタンの上と右が同時に押された場合、BUTTON関数の返す値は9に成り、1(上)とも、8(右)とも一致しなく成ります。
其処で、調べ度いビットが立って居るか(該当する豆電球が点灯して居るか)を調べるのに、ビット演算子で有るAND演算子を使用します。例えば、十字ボタンの上と右が同時に押され、BUTTON関数の返す値が9の時に、十字ボタン上が押された時に行う処理は、下記の様に記述します。
IF (BUTTON(0) AND 1)==1 THEN ' (BUTTON(0) AND #A)==#A の記述も可
'十字ボタン上が押された時に行う処理
ENDIF
猶、プチコン3号では、0以外はTRUE(条件成立)と看做されるので、IF BUTTON(0) AND 1 THEN と謂う記述も可です。
似た様な演算子に、&& と || が有ります。此れは、複数の条件を繋ぐ為の論理演算子と呼ばれ、AND や OR のビット演算子とは区別されます。例えば、AボタンとBボタンの孰れが押されても同じ処理を行う場合、下記の様に記述します。
B=BUTTON(0)
IF (B AND #A) || (B AND #B) THEN
'AボタンかBボタンが押された時の処理
ENDIF
上記は、||演算子の代わりにOR演算子を使用しても、一見同じ動作を仕ますが、実際の動作は異なります。
上記の||演算子では、Aボタンが押されて居れば、Bボタンが押されて居るかは評価しません(条件の判定を仕ません)。即ち、先の条件が満たされて居れば、後の条件は考慮する必要が無いので、ショートカットされます。此れに対して、OR演算子は、先の条件が満たされて居るにも拘らず、後の条件も評価します。
たくさんの回答ありがとうございます!!そして返答遅れてすみません、
上ボタンを押したらSPを表示して、下ボタンを押したらSPを消すプログラムが作れました、で、ORのことですが、例えば、上ボタンとAボタンを押したときにBUTTON(2)==17とするのではなく、BUTTON(2)1 OR 16 と言うふうにするのであっていますか?
1 OR 16 は結局17になるので、どちらで書いても構いませんよ。
①IF BUTTON(2)==17 THEN ~
②IF BUTTON(2)==(#UP OR #A) THEN ~
見たときのわかりやすさが違う程度でどちらも同じです。わかりやすい表記を好むなら②、短いほうがいいなら①、このへんは好みの問題と言えます。
あと②だと例えばAボタンをXボタンに変えたいとき、#Aを#Xとするだけでいいというのもあります。①風に書くなら65(1 OR 64)ですね。
画像のプログラムについてひとつ言うなら、画面の描画やボタン入力を伴う永久ループを回すときは VSYNC 1 をループ末端(画像ではNEXT)の手前に入れてくださいね。
上とA以外のものが押されていても上とAを押せばとにかく実行したい、というときはANDを使って
IF (BUTTON(2) AND 17) THEN ~
のようにすれば余計なものがいっぱい押されていてもきちんとTHEN以降が実行されます。
&B10010101 (149) 左上、A、Yを同時に押す
&B00010001 (17) #UP OR #A
-----------------
&B00010001 (17) 上記のANDの結果