龍神録プログラミング第9章に関して

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
滝の上

龍神録プログラミング第9章に関して

#1

投稿記事 by 滝の上 » 14年前

こんばんは、滝の上です。
龍神録のプログラムを練習し始めたのですが、第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////////から変換ということは初めてだったのでこの変換についても教えていただけるとうれしいです。(もしくは、参考サイト等ありましたら教えてください)

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録プログラミング第9章に関して

#2

投稿記事 by Dixq (管理人) » 14年前

こんにちは。
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章に関して

#3

投稿記事 by 滝の上 » 14年前

分かりやすい解説ありがとうございます。
簡単に考えるのがよかったのですね。
あの後、10進数に変換してから計算すればいいのかなと思い、
http://homepage1.nifty.com/mstak/Comput ... form2.html
の変換機能を使わせてもらい、10進数に変換し、2進数に変換するという作業を繰り返したところ
「あっ」となり、つかえていたものがが取れました。
無事解決いたしました。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る