投稿
Daisuke 0909daiki09
ゼットさんが初心者向け?に書いて下さったこのプログラムの4,5,6行の意味がよくわかりません…親切な方教えてください。
4そうだね
プレイ済み
返信[1]
親投稿
プクニャン pukunyan1228
フォローされて参上しました プクニャンです!!! フォローされたからにゃ かたえなあきまへんよ お客さん!! ええっとそれはですねーー まぁ…………… うーーん……… スプライト君が動く? (自分でもよくわからない) うーーーーーん そこの数値をいじると スプライト君の動きが 変わります!! はいそんな気がします (期待させてごめんなさい)
0そうだね
プレイ済み
返信[2]
親投稿
みどりむし shiyon_29
このように実験する心も大切なのだ。
1そうだね
プレイ済み
返信[3]
親投稿
Daisuke 0909daiki09
おお!すごいですね!僕にとっては未知の領域です…
0そうだね
プレイ済み
返信[4]
親投稿
プクニャン pukunyan1228
え、?? え??? なんでしょうかそれ?? スプライトちゃうん? ほらほら、みてくださいよ ぼくの顔真っ赤ですよ? はい………… 「にわかですいませんでしたぁぁ!」 あ、フォローありがとです
0そうだね
プレイ済み
返信[5]
親投稿
MIKI ifconfig
x >> n = x / 2のn乗 という意味なので x >> 3 = x / 2の3乗 = x / 8 になります。 1 and b>>3 = 1 and b/8 = (8 and b)/8 (通分した) なので右ボタンが押されているときだけ 1 になりそれ以外は0になります。右が押されてた場合4行目は x=x+1 になります。 1 and b>>2 =1 and b/4 =(4 and b)/4 これは左が押されてれば1になりそのとき4行目は x=x-1 になります
0そうだね
プレイ済み
返信[6]
親投稿
Daisuke 0909daiki09
みきs»詳しい説明ありがとうございます。ところで質問なのですが、 1 AND B>>3=1 AND B/8 は分かったのですが、通分したところの (8 AND B)/8 がよく分かりません。出来れば教えてくださいお願いします。
0そうだね
プレイ済み
返信[7]
親投稿
Daisuke 0909daiki09
あ。(8 AND B)/8の ↑この8って十字ボタン右のビ ット数を入れてるんですか?
0そうだね
プレイ済み
返信[8]
親投稿
こうやま kouyama1967
 これは 変数Bが0の時→(8と0をANDしたら→0)÷8→0 変数Bが8の時→(8と8をANDしたら→8)÷8→1  という変化をします。  ここまで徹底的に縮めた数式は、このミーバースに来ている方では、おちゃめさんが詳しいです。ただし縮めまくってある関係上、初心者には非常に難しいので、理解するまでは B=BUTTON():IF B==8 THEN…  を使っても、全然問題ありません。
0そうだね
プレイ済み
返信[9]
親投稿
otta777 otta777a
この表記の仕方は面白いですね。 自分のプログラムにも応用しようかな。
0そうだね
プレイ済み
返信[10]
親投稿
やまちゃん yamachan360
ナイス表記ですね。ただ上級者向きな気も。。 4行目は以下が基本で IF B AND 8 THEN X=X+1 IF B AND 4 THEN X=X-1 これを算術演算子を使って条件判断を外す(判断結果が+1か変化無しなので同等の演算はSGN)と以下になります。 X=X+SGN(B AND 8)-SGN(B AND 4) ここから SGN(B AND 8) を B>>3 AND 1 とビット演算で代用するのがキモですね。 プチコンはわかりませんが、たいていの環境でビット演算は高速なので、昔からよく使われているテクニックです。 ただあくまで短く、高速に動作させるための書き方です。 慣れないうちは入力が面倒でも、最初のIF文のやつをお薦めします。
2そうだね
プレイ済み
返信[11]
親投稿
ツララ LongIceSword
慣れると2の何乗は幾つって暗算で出来る様になるのでシフト演算するまでもなくなるんですけど、最初にUP_KEY=1、DOWN_KEY=2みたく各ボタンに対応する数値を代入した変数を用意しちゃうってのも手ですね。 みき★さんの説明の通り、演算子の優先順位はシフト演算よりも四則演算の方が先に実行されるので、もしかしたらなんですけど(1 AND B>>3)は動作内容的に(1 AND(B>>3))と言うふうに書きたかったのかも。 まぁ、あれこれ邪推するよりも真相はゼットさんの解説待ちですね。
0そうだね
プレイ済み
返信[12]
親投稿
Daisuke 0909daiki09
皆さんありがとうございます!
0そうだね
プレイ済み
返信[13]
親投稿
ツララ LongIceSword
ちなみにMIDORIMUSIさんの実験で1<<99の結果が0になっているのは、シフト演算が単純な掛け算じゃなくてビットの移動のため自動的に整数型に変換されて、整数型のビット長(32ビット)を超えた分が捨てられて0になってるんですね。 試しに?1<<31と打ち込んで実行すると、整数型の符号ビットが立ってマイナスの数値が返ってきますよ。
0そうだね
プレイ済み
返信[14]
親投稿
もともとの書き込みのプログラムリスト、全然初心者向けじゃないw 初心者向けはやっぱりIFでしょ
6そうだね
プレイ済み
返信[15]
親投稿
ナツキ natukin1978
プログラムは、人々がそれを読むために書かれるべきである。 たまたま、それが計算機で実行できるにすぎない。 私の好きな格言(?)です。
4そうだね
プレイ済み
返信[16]
親投稿
プクニャン pukunyan1228
ふむふむ勉強になりますね~
0そうだね
プレイ済み
返信[17]
親投稿
ΖΕΧ ZEX256
このプログラムは、十字ボタンの操作によりスプライトを上下左右斜めに移動するものです。 理解するには幾つかの知識・技術が必要となりますので、それを合わせて解説します。 事前知識として、まず2進数から 人が普段使う数値を10進数と呼びます、これは1つの桁が 0~9 の10通りの表現があるからです。 2進数は、1つの桁を 0、1 の2つのみの数値で表します。 2進数で 0+1=1 となり、10進数と同じ表現ですが、1+1=10 となり桁上りします。 2進数の 10 は、10進数の 2 と同じ意味になります。 2進数1桁のことをビットと呼びます。 余談:3DSのCPUは32ビットですので、2進数32桁を一度に計算できるのです。 他に16進数という表現もあります、2進数と親和性が高く、よく使われます。
0そうだね
プレイ済み
返信[18]
親投稿
ΖΕΧ ZEX256
B=BUTTON() これはボタン操作の結果を変数 B に取り出すコードです。 十字ボタンを操作した時の変数 B の値がどうなってるのか見てみましょう。 何もボタンを押さない時 B は 0 です、これはビットで考えると (0000) です。(2進数下位4ビットのみ表現) [→]ボタンを押した時 8 (1000) [←]ボタンを押した時 4 (0100) [↓]ボタンを押した時 2 (0010) [↑]ボタンを押した時 1 (0001) 1 が立っているビットが十字ボタンの各ボタンのビットです。 斜めに押すと、複数のビットが同時に立つのです。
0そうだね
プレイ済み
返信[19]
親投稿
ΖΕΧ ZEX256
X=X+(1AND B>>3)-(1AND B>>2) Y=Y+(1AND B>>1)-(1AND B) この処理では、ボタン操作の結果 変数 B をもとに計算式のみで直接、座標X,Yに反映しています。 ここで使う技術は、ビットシフトと、ビット演算です。 ビットシフト ビットシフトとは、数値のビット構成をベルトコンベアー式に、隣の桁に移動させる演算です。 << 左シフト、>> 右シフトがあります(ここでは算術シフト、論理シフトについては割愛します) B>>3 この記述で B を 3ビット右シフトします。 B が 8 (1000) だったとしましょう。 B>>3 の結果は 1 (0001) です、ビットの位置が右に3つ移動しています。
0そうだね
プレイ済み
返信[20]
親投稿
ΖΕΧ ZEX256
ビット演算 AND、OR、XOR、NOTなどがあります。 このプログラムで使用しているANDを説明します。 AND (論理積)は、2つの値の同じ桁のビットが、両方とも 1 の場合、計算結果 1 となり、 どちらか片方が 0 の場合、計算結果は 0 となる演算です。 筆算だと 0011 AND 0101 --------- 0001 ANDを、どんな時に使うのかと言うと、特定のビットだけを取り出し、他のビットを 0 にしたい時に使います。 B が 1111だった場合 1 AND B を計算すると結果は 0001 になります。
0そうだね
プレイ済み
返信[21]
親投稿
ΖΕΧ ZEX256
ここまでの説明をふまえ、この処理をバラして考えます。 X=X+(1AND B>>3)-(1AND B>>2) Y=Y+(1AND B>>1)-(1AND B) (1AND B>>3) これは[→]ボタンを押した時に 1 になります。 (1AND B>>2) これは[←]ボタンを押した時に 1 になります。 (1AND B>>1) これは[↓]ボタンを押した時に 1 になります。 (1AND B)   これは[↑]ボタンを押した時に 1 になります。 あとは、この結果を変数 X,Yに足したり引いたりして座標を移動させ、 最後に SPOFS 0,X,Y でスプライトの表示位置としています。
0そうだね
プレイ済み
返信[22]
親投稿
ΖΕΧ ZEX256
このプログラムについて 初心者向きではないという意見もあり、それも解かるのですが、 人はいつまでも初心者ではありません。 疑問を持ち、理解した時、技術は身につくものです。 そういう意味で、良い質問でした。
4そうだね
プレイ済み
返信[23]
親投稿
Daisuke 0909daiki09
僕ゼットさんだと勘違いしてました…ZEXさんすみませんm(_ _)m
1そうだね
プレイ済み
返信[24]
親投稿
Daisuke 0909daiki09
ZEXさん»解説といい言葉ありがとうございます!
0そうだね
プレイ済み
返信[25]
親投稿
プログラムの初心者向けではないですが、ビット演算の初心者向けではあるのかなとも思いますね〜。 わからない概念を理解するとプログラムの選択肢が広がりますからね。頑張ってください!
3そうだね
プレイ済み