こんばんは、滝の上です。
龍神録のプログラムを練習し始めたのですが、第9章のところで詰まってしまいました。
[coad]
void GetHitPadStateAll(){
int i,PadInput,mul=1;
PadInput = GetJoypadInputState( DX_INPUT_PAD1 );//パッドの入力状態を取得
for(i=0;i<16;i++){
if(PadInput & mul) pad.key++;
else pad.key=0;
mul*=2;
}
[/coad]
上のコードの中の特に
if(PadInput & mul)
この部分が分かりません。
ビット演算で1か0を返すということは分かりました。
とりあえず、PadInputには0x///////というものが入っているということは分かったのですが。
どう2進数に切り替えているのかが分かりません。
16進数からの変換・・・・かな、と思ったのですが、どうなのでしょうか?
16進数の変換は一応、学んだのですが、0x////////から変換ということは初めてだったのでこの変換についても教えていただけるとうれしいです。(もしくは、参考サイト等ありましたら教えてください)
龍神録プログラミング第9章に関して
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 15年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 龍神録プログラミング第9章に関して
こんにちは。
DXライブラリってあらゆることをラップしてわかりやすくしてあるのに、ここだけ細かくビットに入ってるんですよねぇ。
分かりやすく説明する為に、ジョイパッドは「下上左右」の4キーしかないとし、0ビット目から順に対応しているとしましょう。
掛け算に近いと思うと分かりやすいと思います。
つまりかける方もかけられる方も1でなければ計算結果は0になるわけです。
ここで、右キーが押されているかどうすればわかるかというと、
Key と 0001 の論理積の結果が0001になったかどうかを見ればよいのです。
他の桁は、かける方が全部0なので、0にしかなりません。つまり1にした桁のビットが立っているかどうかが分かるのです。
同様に、左キーが押されているかどうかは
Key と 0010 の論理積の結果が0010になったかどうかを見ればよいですね。
0001や0010が普段私たちが使っているような10進数なら桁を上げるのに10をかけますが、
これは2進数ですから、桁を上げるには2をかけます。
このように一つ桁を上げては論理積を計算・・を繰り返しているのです。
2をかける方法と、ビットシフトをする方法がありますが、初心者を対象にしているので、掛け算の方が分かりやすいかなと思い、
掛け算にしてあります。
if文の条件式は0以外が真を示しますから、
if(PadInput & mul)
とかけば、どこかの桁が一つでも立っていれば真となるわけです。
DXライブラリってあらゆることをラップしてわかりやすくしてあるのに、ここだけ細かくビットに入ってるんですよねぇ。
分かりやすく説明する為に、ジョイパッドは「下上左右」の4キーしかないとし、0ビット目から順に対応しているとしましょう。
0 0 0 0 ↑↑↑↑ 下上左右 今、右キーが押されているとすればキーの入力状態(Key)の中身は Key = 0001 になるはずです。 論理積というのは、 0と0なら0 1と0なら0 0と1なら0 1と1なら1という対応関係にある計算です。
掛け算に近いと思うと分かりやすいと思います。
つまりかける方もかけられる方も1でなければ計算結果は0になるわけです。
ここで、右キーが押されているかどうすればわかるかというと、
Key と 0001 の論理積の結果が0001になったかどうかを見ればよいのです。
他の桁は、かける方が全部0なので、0にしかなりません。つまり1にした桁のビットが立っているかどうかが分かるのです。
同様に、左キーが押されているかどうかは
Key と 0010 の論理積の結果が0010になったかどうかを見ればよいですね。
0001や0010が普段私たちが使っているような10進数なら桁を上げるのに10をかけますが、
これは2進数ですから、桁を上げるには2をかけます。
このように一つ桁を上げては論理積を計算・・を繰り返しているのです。
2をかける方法と、ビットシフトをする方法がありますが、初心者を対象にしているので、掛け算の方が分かりやすいかなと思い、
掛け算にしてあります。
if文の条件式は0以外が真を示しますから、
if(PadInput & mul)
とかけば、どこかの桁が一つでも立っていれば真となるわけです。
-
滝の上
Re: 龍神録プログラミング第9章に関して
分かりやすい解説ありがとうございます。
簡単に考えるのがよかったのですね。
あの後、10進数に変換してから計算すればいいのかなと思い、
http://homepage1.nifty.com/mstak/Comput ... form2.html
の変換機能を使わせてもらい、10進数に変換し、2進数に変換するという作業を繰り返したところ
「あっ」となり、つかえていたものがが取れました。
無事解決いたしました。
ありがとうございました。
簡単に考えるのがよかったのですね。
あの後、10進数に変換してから計算すればいいのかなと思い、
http://homepage1.nifty.com/mstak/Comput ... form2.html
の変換機能を使わせてもらい、10進数に変換し、2進数に変換するという作業を繰り返したところ
「あっ」となり、つかえていたものがが取れました。
無事解決いたしました。
ありがとうございました。