プレイ日記
ボタンを押したら何をする、みたいなのって教えてくれた人のサンプルプログラムを見ると、この命令を使っていました、が、この命令の意味がわかりません、ビットって何?そもそもなんで足し算をするの?
3そうだね
プレイ済み
返信[1]
親投稿
おおみの Omi-no-mino-398
足し算をするのは複数のボタンを同時に押したとき、それぞれの値をすべて反映させるためです。 ビットとは: 数の単位です。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を返します。
0そうだね
プレイ済み
返信[2]
親投稿
おおみの Omi-no-mino-398
C=#UP OR #LEFT ではCに#UP(1)と#LEFT(4)の論理和5が入ります。 2進数で表すとこうなります。  &B0001 (1) #UP  &B0100 (4) #LEFT  ------  &B0101 (5) 1 OR 4 の結果 ボタンが押されているチェックでANDを使います。 IF (BUTTON() AND #UP)==1 THEN ~ 右上が押されるとBUTTON()は9を返します。  &B1001 (9) BUTTON() 右上を押した  &B0001 (1) #UP  ------  &B0001 (1) 9 AND 1 の結果 これで上が押されているという判定ができました。
0そうだね
プレイ済み
返信[3]
親投稿
おおみの Omi-no-mino-398
ORの結果は普通に+で計算した時と同じ答えになることが多いですが、複数のビットが1になるような数がある場合は単純な足し算と違う値になります。  &B1011 (11)  &B1000 (8)  ------  &B1011 (11) このように、11 OR 8 の結果は11となります。
0そうだね
プレイ済み
返信[4]
親投稿
1)AND、OR、XORのイメージです。これが32個並んでいて同時に32個計算するのがビット演算です。 KEY:ZEW3VKAV 2)ビットシフトのイメージです。 KEY:L4NNE3K4 参考になればいいのですが。 ちなみに、「ビット」は、公共放送の番組「ビットワールド」の「ビット」と同じものです。
0そうだね
プレイ済み
返信[5]
親投稿
BUTTON関数の返す値はビットフィールドに成って居て、イメージで謂うと、13個の豆電球が並んで居て、ボタンを押すと、其れに対応した豆電球が点灯する感じです(●が点灯)。 ○○○○○○○○○○○○● 十字ボタン上を押した場合 ○○○○○○○○○○○●○ 十字ボタン下を押した場合 ○○○○○○○○○○●○○ 十字ボタン左を押した場合 ○○○○○○○○○●○○○ 十字ボタン右を押した場合 ○○○○○○○○●○○○○ Aボタンを押した場合 ○○○○○○○●○○○○○ Bボタンを押した場合 ○○○○○○●○○○○○○ Xボタンを押した場合 ○○○○○●○○○○○○○ Yボタンを押した場合 ○○○○●○○○○○○○○ Lボタンを押した場合 ○○○●○○○○○○○○○ Rボタンを押した場合 ○●○○○○○○○○○○○ ZRボタンを押した場合 ●○○○○○○○○○○○○ ZLボタンを押した場合
0そうだね
プレイ済み
返信[6]
親投稿
此れを、●を1、○を0と仕た2進数(各桁が0と1で表され、2に成ると桁上がりする数値)と看做すと、下記の様に成ります。更に、此れを10進数(各桁が0~9で表され、10に成ると桁上がりする数値)で表した物が、括弧内の数値です。右端は、プチコン3号での定義です。 0000000000001(1)#UP 0000000000010(2)#DOWN 0000000000100(4)#LEFT 0000000001000(8)#RIGHT 0000000010000(16)#A 0000000100000(32)#B 0000001000000(64)#X 0000010000000(128)#Y 0000100000000(256)#L 0001000000000(512)#R 0100000000000(2048)#ZR 1000000000000(4096)#ZL
0そうだね
プレイ済み
返信[7]
親投稿
従って、十字ボタン上が押された場合のBUTTON関数の返す値(戻り値)は、1と成るので、十字ボタン上が押された時に行う処理は、下記の様に記述します。 IF BUTTON(0)==1 THEN ' BUTTON(0)==#A の記述も可 '十字ボタン上が押された時に行う処理 ENDIF 単一のボタン押し下げ状態を判別する時は此れで良いですが、複数のボタンが同時に押し下げられた場合は、上記では判別出来ない事に成ります。例えば、十字ボタンの上と右が同時に押された場合、BUTTON関数の返す値は9に成り、1(上)とも、8(右)とも一致しなく成ります。
0そうだね
プレイ済み
返信[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 と謂う記述も可です。
0そうだね
プレイ済み
返信[9]
親投稿
処で、AND演算子は、被演算数と演算数の夫々同じ桁(位)のビットを乗算(論理積)する演算子で、互いのビットが1の時に1と成り、其れ以外は0と成ります(1×1→1、1×0→0)。従って、9と1をAND演算すると、下記の様に成ります。 0000000001001(9) 0000000000001(1) ------------- 0000000000001(1) 此れで、十字ボタン上が押されて居る事が解ります。亦、十字ボタン右が押されて居るかを知り度い場合は、下記の様に成ります。 0000000001001(9) 0000000001000(8) ------------- 0000000001000(8)
0そうだね
プレイ済み
返信[10]
親投稿
従って、十字ボタンの上と右が同時に押せば、右上に移動すると謂う処理を行い度い場合、下記の様に記述すれば良い事に成ります。 B=BUTTON(0) IF B AND 1 THEN '上に移動 ENDIF IF B AND 8 THEN '右に移動 ENDIF
0そうだね
プレイ済み
返信[11]
親投稿
亦、OR演算子は、被演算数と演算数の夫々同じ桁(位)のビットを加算(論理和)する演算子で、孰れかのビットが1の時に1と成り、其れ以外は0と成ります(1+1→1、1+0→1、0+0→0)。従って、9と1をOR演算すると、下記の様に成ります。 0000000001001(9) 0000000000001(1) ------------- 0000000001001(9) OR演算は、飽く迄も同じ桁(位)のビットの状態を調べる物で、算術加算の様に、桁上がりは仕ません。『有る』と『有る』は勿論『有る』、『有る』と『無い』でも二人合わせれば『有る』、『無い』と『無い』で本当に『無い』と謂う事です。 一般に、AND演算子は、調べ度いビット以外を0に設定して隠す目的で使用されるのでマスク演算子、OR演算子は、特定のビットを1に設定する目的で使用されるのでセット演算子とも呼ばれて居ます。
0そうだね
プレイ済み
返信[12]
親投稿
似た様な演算子に、&& と || が有ります。此れは、複数の条件を繋ぐ為の論理演算子と呼ばれ、AND や OR のビット演算子とは区別されます。例えば、AボタンとBボタンの孰れが押されても同じ処理を行う場合、下記の様に記述します。 B=BUTTON(0) IF (B AND #A) || (B AND #B) THEN 'AボタンかBボタンが押された時の処理 ENDIF 上記は、||演算子の代わりにOR演算子を使用しても、一見同じ動作を仕ますが、実際の動作は異なります。 上記の||演算子では、Aボタンが押されて居れば、Bボタンが押されて居るかは評価しません(条件の判定を仕ません)。即ち、先の条件が満たされて居れば、後の条件は考慮する必要が無いので、ショートカットされます。此れに対して、OR演算子は、先の条件が満たされて居るにも拘らず、後の条件も評価します。
0そうだね
プレイ済み
返信[13]
親投稿
逆に、&&演算子は、先の条件が満たされて居なければ、後の条件は考慮する必要が無いので、ショートカットされます。此れに対して、AND演算子は、先の条件が満たされて居ないにも拘らず、後の条件も評価します。 DIM A[3] N=3 IF N<LEN(A) && A[N]==1 THEN … 上記では、配列の或る要素の値を調べるのに、予め要素番号が範囲内が何うかをチェック( N<LEN(A) )して居るので、例外(エラー)は発生しません。併し、&&演算子の代わりにAND演算子を使用すると、上記は例外を発生します。 従って、ビット演算(各ビットに対する処理)を行う場合は AND や OR、論理演算(複合条件の結合)を行う場合は && や || を使用します。
0そうだね
プレイ済み
返信[14]
親投稿
たくさんの回答ありがとうございます!!そして返答遅れてすみません、 上ボタンを押したらSPを表示して、下ボタンを押したらSPを消すプログラムが作れました、で、ORのことですが、例えば、上ボタンとAボタンを押したときにBUTTON(2)==17とするのではなく、BUTTON(2)1 OR 16 と言うふうにするのであっていますか?
0そうだね
プレイ済み
返信[15]
親投稿
おおみの Omi-no-mino-398
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)の手前に入れてくださいね。
1そうだね
プレイ済み
返信[16]
親投稿
日常使う言葉との対応 記号、数学用語、日常用語 AND、かつ(論理積)、「両方が1」 OR、または(論理和)、「どちらか1方が1」と「両方が1」 XOR、排他的論理和、「どちらか1方が1」 の時に計算結果が1になります。それ以外は0になります。 ただし、1:真、0:偽です。
1そうだね
プレイ済み
返信[17]
親投稿
おおみの Omi-no-mino-398
上とA以外のものが押されていても上とAを押せばとにかく実行したい、というときはANDを使って IF (BUTTON(2) AND 17) THEN ~ のようにすれば余計なものがいっぱい押されていてもきちんとTHEN以降が実行されます。  &B10010101 (149) 左上、A、Yを同時に押す  &B00010001 (17) #UP OR #A  -----------------  &B00010001 (17) 上記のANDの結果
1そうだね
プレイ済み
返信[18]
親投稿
おおみの Omi-no-mino-398
訂正: ×IF (BUTTON(2) AND 17) THEN ~ ○IF (BUTTON(2) AND 17)==17 THEN ~
1そうだね
プレイ済み
返信[19]
親投稿
マギー M191246
少しだけ補足。 BUTTON(2)を使って 二つのボタンの同時押しを知りたい場合、 その二つのボタンを同時に押し始めないと 認識してくれないので、 そこだけ注意が必要です。 (例えば、先に上を押して、押したまま、 あとからAを押してもわからない という意味です。)
1そうだね
プレイ済み