if (key == PAD_INPUT_UP)と if (key & PAD_INPUT_UP)の違いは何なのか 飛行機を斜め上に動かせるようにするには&演算子を用いることになります

マックス「ジョイパッドの入力に応じて飛行機が動くプログラムの仕組みも


わかったじゃないか


いいのう」


ジョイパッドの入力に応じて飛行機が動くプログラムこちらです

👇


#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


int x = 0;


int y = 0;



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです


👇

https://youtu.be/UePaU-jOeKc


solarplexuss「ねえ ねえ


ちょっと ちょっと


みなさん


疑問におもってることがあるんだけど・・・」


マックス「喜ぶがいい 今日の昼はカレーだぞお 」


solarplexuss「そこじゃな~い」


マックス「なんだ 今日のデザートの話か?」


solarplexuss「そこでもな~い」


マックス「んん どこなんだ?」


solarplexuss「ええとね


今のプログラムのここの部分に注目してほしいな

👇

int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


🐭 🐁  🐭 🐁  🐭 🐁

PAD_INPUT_DOWNは1

PAD_INPUT_LEFTは2

PAD_INPUT_RIGHTは4

PAD_INPUT_UPは8

をあらわしています

🐭 🐁  🐭 🐁  🐭 🐁


👆

この命令文は


🌞🌞🌞キーボードから十字キーの↑ボタンが入力されている状態で🌞🌞🌞




int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


key に8が代入されるので


if (key & PAD_INPUT_UP) y = y - 4;


if (8 & 8) y = y - 4;


となり

if (8 & 8) y = y - 4;

if (8) y = y - 4;

イコール

if (1) y = y - 4;

となり

y = y - 4;


が実行されることになるよね


だからyの値が4小さくなるので


DrawGraph(x,y,graphichandle, TRUE);


が実行されると


飛行機は上に4ドット移動することになるわけだ」


マックス「なんだ そんなことか


そりゃあそうだろう」


solarplexuss「


だったら


🌞if (key & PAD_INPUT_UP) y = y - 4;🌞


でなくて


&を==に変えた


if (key == PAD_INPUT_UP) y = y - 4;


でもいいんじゃない?



これでも


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


key に8が代入されるので


if (key == PAD_INPUT_UP) y = y - 4;


if (8 == 8) y = y - 4;


となり

if (8 == 8) y = y - 4;

if (1) y = y - 4;

となり

y = y - 4;


が実行されることになるよね


だからyの値が4小さくなるので


DrawGraph(x,y,graphichandle, TRUE);


が実行されると


飛行機は上に4ドット移動することになるじゃない😊」


マックス「ほんとうだ」


solarplexuss「


つまり


今のプログラムのここの部分は

👇

int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


🐭 🐁  🐭 🐁  🐭 🐁

PAD_INPUT_DOWNは1

PAD_INPUT_LEFTは2

PAD_INPUT_RIGHTは4

PAD_INPUT_UPは8

をあらわしています

🐭 🐁  🐭 🐁  🐭 🐁

👆


👇


こんな風にかきかえられるんじゃない?

👇

int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key== PAD_INPUT_RIGHT) x = x + 4;

//🌞🌞👆&演算子を==演算子に変更しました


🐭 🐁  🐭 🐁  🐭 🐁

PAD_INPUT_DOWNは1

PAD_INPUT_LEFTは2

PAD_INPUT_RIGHTは4

PAD_INPUT_UPは8

をあらわしています

🐭 🐁  🐭 🐁  🐭 🐁

👆


マックス「おお いいところにきづくじゃないか


そういえば


そうだな」


solarplexuss「==演算子を用いるこっちの方が普通なんじゃない?


なんで


&演算子が用いられているのかな?」


マックス「それも そうだなあ


なんで


&演算子が用いられているのか・・・


ふ~む


そうだなあ


試しに


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key== PAD_INPUT_RIGHT) x = x + 4;


を用いたプログラムを実行してみたら


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


のように&演算子を用いた場合と



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key== PAD_INPUT_RIGHT) x = x + 4;


のように==演算子を用いた場合の違い


がわかるんじゃないか?」


solarplexuss「そうしよっ


何か


違いが出るかな?」



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key== PAD_INPUT_RIGHT) x = x + 4;


がもちいられたプログラムはこちらです

👇

#include "DxLib.h"


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

{



ChangeWindowMode(TRUE); // ウインドウモードに設定します


if (DxLib_Init() == -1) // DXライブラリを初期化処理しています

{

return -1; // DXライブラリの初期化に失敗したら直ちにプログラムを終了します

}


int graphichandle;


graphichandle = LoadGraph("画像データ\\ソーラーが描いた飛行機.bmp");



SetDrawScreen(DX_SCREEN_BACK);//👈🌞SetDrawScreen関数です


int x = 0;


int y = 0;



while (CheckHitKey(KEY_INPUT_ESCAPE) == 0 && ProcessMessage() == 0) {


DrawBox(100, 100, 500, 300, GetColor(0, 255, 255), TRUE);


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key == PAD_INPUT_RIGHT) x = x + 4;




DrawGraph(x,y,graphichandle, TRUE);


ScreenFlip();


ClearDrawScreen();


};



DxLib_End(); // DXライブラリの使用を終了します DXライブラリの使用しているメモリ領域が解放されます


return 0; // プログラムを終了します

}


デバッグなしで実行をしてから一度プログラムを終了し

生成されたexeファイルをハードディスクから探し出しクリックする方法により得られたプログラムの実行結果はこちらです


👇

https://youtu.be/_qhH0pRE_kE



solarplexuss「・・・


ふつうに飛行機を動かせるし違いなんてなさそう・・・


あれえ?


なんかおかしい?


斜めにボタンを押しているのに


飛行機が斜めにとんでいかないいいいいいいいっ


なんで???」


ソーラー「それは



🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンが🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に入力されている状態で🌞💖🌞💖🌞




int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


       🌞キーボードの↑ボタンの入力に対応した整数値🌞



       🌞キーボードの→ボタンの入力に対応した整数値4🌞



           🌞🌞🌞足し合わされた12🌞🌞🌞


が返されることになります


ですので


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


の実行により

             keyには


          🌞🌞🌞整数値12が 🌞🌞🌞


代入されることになります


そして


PAD_INPUT_UP


には


もとから


キーボードの↑ボタンの入力に対応した数値8が代入されています


PAD_INPUT_DOWN


には


もとから


キーボードの↓ボタンの入力に対応した数値1が代入されています


PAD_INPUT_LEFT


には


もとから


キーボードの←ボタンの入力に対応した数値2が代入されています


PAD_INPUT_RIGHT


には


もとから


キーボードの→ボタンの入力に対応した数値4が代入されています



ですので



🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンが🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に入力されている状態で🌞💖🌞💖🌞



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;//👈==演算子が用いられているのがポイントです

if (key == PAD_INPUT_DOWN) y = y + 4;//👈==演算子が用いられているのがポイントです

if (key == PAD_INPUT_LEFT) x = x -4;//👈==演算子が用いられているのがポイントです

if (key == PAD_INPUT_RIGHT) x = x + 4;//👈==演算子が用いられているのがポイントです


が実行されると


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key == PAD_INPUT_RIGHT) x = x + 4;



if (12 == 8) y = y - 4;

if (12 == 1) y = y + 4;

if (12 == 2) x = x - 4;

if (12 == 4) x = x + 4;



実行されることになります




if (12 == 8) y = y - 4;

if (12 == 1) y = y + 4;

if (12 == 2) x = x - 4;

if (12 == 4) x = x + 4;


if (0) y = y - 4;

if (0) y = y + 4;

if (0) x = x - 4;

if (0) x = x + 4;


に等しいので

  

if (0)に続く命令文


y = y - 4;

y = y + 4;

x = x - 4;

x = x + 4;


は実行されません


ですので  


DrawGraph(x,y,graphichandle, TRUE);


が実行されても


xとyの値は変化していないので


飛行機は


今いる位置から動くことはありません」


solarplexuss「なんと


🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンを🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に押すと🌞💖🌞💖🌞



if (12 == 8) y = y - 4;

if (12 == 1) y = y + 4;

if (12 == 2) x = x - 4;

if (12 == 4) x = x + 4;


になって


飛行機は全く移動することができなくなるんだ


だから


🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンを🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に押しても🌞💖🌞💖🌞


右斜め上にとんでいくこともなくなるんだね」


マックス「じゃあ


🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンを🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に押して🌞💖🌞💖🌞



飛行機を右斜め上に飛ばしたいなら


このように


==演算子を用いるのはまずいってわけだ

👇

int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key == PAD_INPUT_UP) y = y - 4;

if (key == PAD_INPUT_DOWN) y = y + 4;

if (key == PAD_INPUT_LEFT) x = x -4;

if (key == PAD_INPUT_RIGHT) x = x + 4;



じゃあ



🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンを🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に押して🌞💖🌞💖🌞



飛行機を右斜め上に飛ばしたいなら



どのようにすればいいかだが・・・・


もうすでに答えは出ている

👇

int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;

👆


を実行すればいいんだろう



では




🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンが🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に入力されている状態で🌞💖🌞💖🌞




int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると


GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


キーボードの↑ボタンの入力に対応した整数値8



キーボードの→ボタンの入力に対応した整数値4


が足し合わされた12


が返されることになるんだが


そのとき


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


を実行した場合は何がおこなわれるんだ?」



ソーラー「


🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンが🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に入力されている状態で🌞💖🌞💖🌞



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;//👈&演算子が用いられているのがポイントです

if (key & PAD_INPUT_DOWN) y = y + 4;//👈&演算子が用いられているのがポイントです

if (key & PAD_INPUT_LEFT) x = x -4;//👈&演算子が用いられているのがポイントです

if (key & PAD_INPUT_RIGHT) x = x + 4;//👈&演算子が用いられているのがポイントです


が実行されると


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x -4;

if (key & PAD_INPUT_RIGHT) x = x + 4;



if (12 & 8) y = y - 4;

if (12 & 1) y = y + 4;

if (12 & 2) x = x - 4;

if (12 & 4) x = x + 4;


が実行されることになります



まずは


if (12 & 8) y = y - 4;


に注目してね


12は2進数で

00000000000000000000000000001100



8は2進数で

00000000000000000000000000001000


で表されるので


AND演算


12&8


が実行されると




00000000000000000000000000001100

××××××××××××××××××××××××××××××××

00000000000000000000000000001000

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

が行われて

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

00000000000000000000000000001000


すなわち


整数値8


が生成されることになります


12&8の演算結果は8なんですね



なので


if (12&8) y = y - 4;


if (8) y = y - 4;


となります


if ()の()内に0以外の整数値が代入されると


1が代入されているとみなされます


ですので


if (8) y = y - 4;

if (1) y = y - 4;


が実行されていることになります


if ()の()内に1が代入されているので


if ()に続く命令文


y = y - 4;


が実行されることになります


だから


yの値は4減るので


DrawGraph(x,y,graphichandle, TRUE);


が実行されると


飛行機は


今いる位置から


4ドット上に表示されることになります


つまり


飛行機は


今いる位置から


4ドット上に移動することになるんだ



次に


if (12 & 1) y = y + 4;


に注目してね



12は2進数で

00000000000000000000000000001100


1は2進数で

00000000000000000000000000000001


で表されるので


AND演算


12&1


が実行されると


00000000000000000000000000001100

××××××××××××××××××××××××××××××××

00000000000000000000000000000001

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

が行われて

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


12&1の演算結果は0なんですね



なので


if (12&1) y = y + 4;

if (0) y = y + 4;


となり


if ()の()内が0なので


if ()に続く命令文


y = y + 4;


は実行されません



次に


if (12 & 2) x = x - 4;


に注目してね



12は2進数で

00000000000000000000000000001100


2は2進数で

00000000000000000000000000000010


で表されるので


AND演算


12&2


が実行されると


00000000000000000000000000001100

××××××××××××××××××××××××××××××××

00000000000000000000000000000010

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

が行われて

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


12&2の演算結果は0なんですね



なので


if (12&2) x = x - 4;

if (0) x = x - 4;


となり


if ()の()内が0なので


if ()に続く命令文


x = x - 4;


は実行されません



次に


if (12 & 4) x = x + 4;


に注目してね



8は2進数で

00000000000000000000000000001100


4は2進数で

00000000000000000000000000000100


で表されるので


AND演算


12&4


が実行されると


00000000000000000000000000001100

××××××××××××××××××××××××××××××××

00000000000000000000000000000100


が行われて


00000000000000000000000000000100


すなわち


整数値4


が生成されることになります


12&4の演算結果は4なんですね



なので


if (12&4) x = x + 4;

if (4) x = x + 4;

イコール

if (1) x = x + 4;


となり


if ()の()内が1なので


if ()に続く命令文


x = x + 4;


が実行されます


xの値が4増えるので


DrawGraph(x,y,graphichandle, TRUE);


が実行されると


飛行機は


今いる位置から


4ドット右に表示されることになります


つまり


飛行機は


今いる位置から


4ドット右に移動することになるんだ





つまり






🌞💖🌞💖🌞キーボードから十字キーの↑ボタンと→ボタンが🌞💖🌞💖🌞


 

     🌞💖🌞💖🌞同時に入力されている状態で🌞💖🌞💖🌞




int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行されたとき


if (12 & 8) y = y - 4;

if (12 & 1) y = y + 4;

if (12 & 2) x = x - 4;

if (12 & 4) x = x + 4;


が実行されることになるので


実行されるのは


if (key & PAD_INPUT_UP) y = y - 4;


if (key & PAD_INPUT_RIGHT) x = x + 4;


の2つなんです


ですので


飛行機が今いる位置から

上に4ドット

右に4ドット

移動することになります


つまり右斜め上に移動することになるんだよ」


マックス「&演算子 やるなあ」


solarplexuss「この仕組みを考えた人すごいなあ」



ソーラー「


次にもし



   🐳🐳🐳何もキーボードのボタンが押されていない状態で🐳🐳🐳



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されると



GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として


0が返されることになります


ですので


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


が実行されていることにより


           keyには


数値0が


代入されることになります



ですので



   🐳🐳🐳何もキーボードのボタンが押されていない状態で🐳🐳🐳


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行されると


if (0 & 8) y = y - 4;

if (0 & 1) y = y + 4;

if (0 & 2) x = x - 4;

if (0 & 4) x = x + 4;

実行されることになります



まずは


if (0 & 8) y = y - 4;


に注目してね


0は2進数で

00000000000000000000000000000000


8は2進数で

00000000000000000000000000001000


と表されるので


AND演算


0&8


が実行されると




00000000000000000000000000000000

××××××××××××××××××××××××××××××××

00000000000000000000000000001000


が行われて


00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


0&8の演算結果は0なんですね



なので


if (0 & 8) y = y - 4;


if (0) y = y - 4;


となり


if (0)に続く命令文


y = y - 4;


は実行されません


次に


if (0 & 1) y = y + 4;


に注目してね



0は2進数で

00000000000000000000000000000000


1は2進数で

00000000000000000000000000000001


で表されるので


AND演算


0&1


が実行されると


00000000000000000000000000000000

××××××××××××××××××××××××××××××××

00000000000000000000000000000001


が行われて


00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


0&1の演算結果は0なんですね



なので


if (0&1) y = y + 4;


if (0) y = y + 4;


となり


if (0)に続く命令文


y = y + 4;


は実行されません



次に


if (0 & 2) x = x - 4;


に注目してね



0は2進数で

00000000000000000000000000000000


2は2進数で

00000000000000000000000000000010


で表されるので


AND演算


0&2


が実行されると




00000000000000000000000000000000

××××××××××××××××××××××××××××××××

00000000000000000000000000000010


が行われて


00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


0&2の演算結果は0なんですね



なので


if (0&2) x = x - 4;


if (0) x = x - 4;


となり


if (0)に続く命令文


x = x - 4;


は実行されません



次に


if (0 & 4) x = x + 4;


に注目してね



0は2進数で

00000000000000000000000000000000


4は2進数で

00000000000000000000000000000100


で表されるので


AND演算


0&4


が実行されると




00000000000000000000000000000000

××××××××××××××××××××××××××××××××

00000000000000000000000000000100


が行われて


00000000000000000000000000000000


すなわち


整数値0


が生成されることになります


0&4の演算結果は0なんですね



なので


if (0&4) x = x + 4;


if (0) x = x + 4;


となり


if (0)に続く命令文


x = x + 4;


は実行されません


つまり



   🐳🐳🐳何もキーボードのボタンが押されていない状態で🐳🐳🐳



int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


が実行されたときは


どのif文も実行されず


飛行機は動かないんだね


何もボタンが押されていないんだから


飛行機が動かないってのはいいことだね


さあ


どう


int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);


if (key & PAD_INPUT_UP) y = y - 4;

if (key & PAD_INPUT_DOWN) y = y + 4;

if (key & PAD_INPUT_LEFT) x = x - 4;

if (key & PAD_INPUT_RIGHT) x = x + 4;


の仕組みは


理解できたかな」


solarplexuss「う~ん


この野菜スープの汁 うまいかも・・・」


ソーラー「何、飲んでるのお!?」















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る