さあC言語(DXライブラリ)を使って超繊細、美麗、箱庭シューティングゲームを作ってみましょう 超初心者向けです 0.367
AND演算を行ってみよう! AND演算のしくみはとって~~~~~も簡単です AND演算 1&5 は 足し算1+5 引き算1-5 掛け算1*5 割り算1/5 の仲間です
AND演算を行ってみよう! AND演算のしくみはとって~~~~~も簡単です AND演算 1&5 は 足し算1+5 引き算1-5 掛け算1*5 割り算1/5 の仲間です
ジョイパッドとキーボード
両方からの入力に応じて飛行機が動くプログラムはこちらです
👇
#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
ソーラー「みなさん
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()文の()内の
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
について観察していたんだったね😊
みんな なにかわかったかな?
堪能した?」
マックス「俺はな
漁にいってたぞ⛵
爽快だった」
solarplexuss「うちは
ダンスの練習してました💃
やはり 爽快でした」
ソーラー「僕は
畑仕事してました
もう とても気持ちよかったよ
よかった よかった~
めでたし めでたし~~~
みんな よかったね」
solarplexuss「ねえ もしかして
誰も
if()文の()内の
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
について観察していない・・・・・」
ソーラー「・・・」
マックス「は!・・・」
ソーラー「そ、そんなことはないです」
solarplexuss「ほんとおぉ~?」
ソーラー「そ、それでは
if()文の()内の
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
について
観察してみましょう みなさん
この
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
の
&は
AND演算子といいます
&が用いられた
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
は
AND演算が行われています
key & PAD_INPUT_UP
は
key
と
PAD_INPUT_UP
の
AND演算がおこなわれています
AND演算の仕組みは
とっても簡単なんだよ」
solarplexuss「え、そうなの AND演算って聞いたことないなあ・・・」
ソーラー「AND演算はコンピューターの計算の基礎で登場してくるんだ・・・
それはおいておいて
早速
AND演算の
仕組みを見ていきましょう
AND演算
すなわち
AND演算子を用いた計算は
1&5
や
6&8
のように
整数値同士で行われることになります
1&5
の計算結果は1
6&8
の計算結果は0
となります
(なぜかは(´▽`)後程解説されます)
このように
基本的に
AND演算は
AND演算子
の左側と右側に整数値を用いておこなうことになります
(もしくは整数値が代入されたint型の変数を用いることになります)」
solarplexuss「
AND演算
1&5
や
6&8
って
ANDだから
1と5
6と8
っていう意味じゃないんだね」
ソーラー「そうなんです
ANDの意味
そのまんまの
1と5
6と8
という意味ではありません
では
AND演算についてどのような仕組みになっているのかを見ていきましょう
AND演算
1&5
を
例にとってみます
&の左辺の整数値1は2進数で
000000000000000000000000000000001
とあらわされます
(1と5はint型の形式でメモリに格納されています
その場合2進数は32ビットであらわされます
2進数については
天国に行けるC言語入門シーズン1を参考にしてください)
&の右辺の整数値5は2進数で
000000000000000000000000000000101
とあらわされます
AND演算
1&5
が実行されると何が行われるか?
ですね(*´▽`*)
どう?
もしかしたら
もう わかったかな~😊」
solarplexuss「わっかりませ~んヽ(^o^)丿」
ソーラー「
AND演算
1&5
が行われるとなにが行われるのか?
めちゃめちゃ簡単なんです
AND演算
1&5
は
足し算1+5
引き算1-5
掛け算1*5
割り算1/5
の仲間なんです
AND演算
1&5
が実行されると
整数値1(000000000000000000000000000000001)
整数値5(000000000000000000000000000000101)
を
😊
新たな整数値(2進数)が作製されます
solarplexuss「どういうこと?」
ソーラー「
どういう仕組みになっているか?
まずは
整数値1(000000000000000000000000000000001)
整数値5(000000000000000000000000000000101)
の2進数表示の
1の位をご覧ください
整数値1の2進数表示の1の位は1
で
整数値5の2進数表示の1の位は1
となっています
この1と1を掛け合わせると
1
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の1の位の値は1
となります
次に
10の位(正確には2の位)をご覧ください
整数値1の2進数表示の10の位(正確には2の位)は0
で
整数値5の2進数表示の10の位(正確には2の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の10の位(正確には2の位)の値は0
となります
次に
100の位(正確には4の位)をご覧ください
整数値1の2進数表示の100の位(正確には4の位)は0
で
整数値5の2進数表示の100の位(正確には4の位)は1
となっています
この0と1を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の100の位(正確には4の位)は0
となります
次に
1000の位(正確には8の位)をご覧ください
整数値1の2進数表示の1000の位(正確には8の位)は0
で
整数値5の2進数表示の1000の位(正確には8の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の1000の位(正確には8の位)は0
となります
次に
10000の位(正確には16の位)をご覧ください
整数値1の2進数表示の10000の位(正確には16の位)は0
で
整数値5の2進数表示の10000の位(正確には16の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の10000の位(正確には16の位)は0
となります
次に
100000の位(正確には32の位)をご覧ください
整数値1の2進数表示の100000の位(正確には32の位)は0
で
整数値5の2進数表示の100000の位(正確には32の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の100000の位(正確には32の位)は0
となります
次に
1000000の位(正確には64の位)をご覧ください
整数値1の2進数表示の1000000の位(正確には64の位)は0
で
整数値5の2進数表示の1000000の位(正確には64の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の1000000の位(正確には64の位)は0
となります
次に
10000000の位(正確には128の位)をご覧ください
整数値1の2進数表示の10000000の位(正確には128の位)は0
で
整数値5の2進数表示の10000000の位(正確には128の位)は0
となっています
この0と0を掛け合わせると
0
になります
ですので
AND演算
1&5
によって
作製される新たな2進数の10000000の位(正確には128の位)は0
となります
以下同様(笑)
・
・
・
・
・
以上の結果
AND演算
1&5
によって
新たな2進数
整数値1(2進数00000000000000000000000000000001)
が生成されます
つまり
1と5の
AND演算
1&5
が行われると
整数値1(2進数00000000000000000000000000000001)
が作成されるんです」
solarplexuss「えっ
何?
この演算?
同じ位同士の0と1を掛け合わせるの?
なぜそんなことをするのかわからない・・・
けど
仕組みはかんたんだね
ただ
同じ位同士の0と1を掛け合わせる
そんだけのこと?
ということは
AND演算
6&8
がおこなわれるとするよね
AND演算
6&8
の
整数値6は2進数では
00000000000000000000000000000110
整数値8は2進数では
00000000000000000000000000001000
なので
00000000000000000000000000000110(整数値6)
××××××××××××××××××××××××××××××××
00000000000000000000000000001000(整数値8)
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
のように同じ位同士の数が掛け合わされると
新たな2進数
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
00000000000000000000000000000000
つまり
整数値0が生成される
なので
AND演算
6&8
の
計算結果は0になるってこと?」
ソーラー「そうなんです どう AND演算の仕組み 分かったかな」
solarplexuss「なぜ
こんな演算が考えられたの?」
ソーラー「AND演算はコンピューターの
ほんとうに
基礎となっている根本的な演算なんです
OR演算っていうのもあるんだけど
そのお話は次の機会にだね・・・」
solarplexuss「なぜ
AND演算
みたいなものがあるのかはわからないけど
AND演算の仕組みはとってもシンプルだね
なんか こうもっと
AND演算って複雑なことが行われていると思ったら
AND演算の仕組みは簡単なんだね」
マックス「ううう」
solarplexuss「マックスがうめいている・・・」
マックス「うまいなあ この饅頭」
solarplexuss「!
何食べてるの?」
ソーラー「みなさ~ん
👇
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
👆
これって何だと思います?」
マックス「う~ん
なんか分かりにくいなあ
とくにこの
&
ってなんだ?」
solarplexuss「まさか
key & PAD_INPUT_UP
で
何かの1つの単語なのかな」
ぶーにゃん「にゃんこも なんのことか わかんにゃ~い」
マックス「そうだろう そうだろう
突然
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;
が実行される前に
その1
ジョイパッド1の十字キー(キーボード)の↑ボタンが押されていたら
if (key & PAD_INPUT_UP) y = y - 4;
の()内の
key & PAD_INPUT_UPの値は1となり
if(1)が成立するので
y = y - 4;
が実行され
飛行機は今いる位置から4ドット上に移動することになるんじゃないか?
(ご注意 yの値が小さくなればなるほど飛行機は画面の上の方に表示されることになります)
その2
ジョイパッドの十字キー(キーボード)の↓ボタンが押されていたら
if (key & PAD_INPUT_DOWN) y = y + 4;
の()内の
key & PAD_INPUT_DOWNの値は1となり
if(1)が成立するので
y = y + 4;
が実行され
飛行機は今いる位置から4ドット下に移動することになるんだろう
(ご注意 yの値が大きくなればなるほど飛行機は画面の下のほうに表示されることになります)
その3
ジョイパッドの十字キー(キーボード)の←ボタンが押されていたら
if (key & PAD_INPUT_LEFT) x = x - 4;
の()内の
key & PAD_INPUT_LEFTの値は1となり
if(1)が成立するので
x = x - 4;
が実行され
飛行機は今いる位置から4ドット左に移動することになるんじゃないか?
その4
ジョイパッドの十字キー(キーボード)の右ボタンが押されていたら
if (key & PAD_INPUT_RIGHT) x = x + 4;
の()内の
key & PAD_INPUT_RIGHTの値は1となり
if(1)が成立するので
x = x + 4;
が実行され
飛行機は今いる位置から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;
👆
は
たぶんそういう仕組みの命令文なんだろうね
だけど
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
が
何なのかあ
よくわからないよね
いったい
key & PAD_INPUT_UP
key & PAD_INPUT_DOWN
key & PAD_INPUT_LEFT
key & PAD_INPUT_RIGHT
は
なんなんだろう?」
ソーラー「ポイントは
この
if()の()内で用いられている&なんだよ」
solarplexuss「&???
key & PAD_INPUT_UP
って
1つの単語なんじゃないの?」
ソーラー「実は
key & PAD_INPUT_UP
の
keyとPAD_INPUT_UP
は
オペランド(被演算子)
で
&
は
オペレータ(演算子)なんです」
マックス「 ど~いうこと 何の説明だ」
ソーラー「ははっ
実は
key & PAD_INPUT_UP
は
1+2
と構造は同じです
key は1
&は+
PAD_INPUT_UPは2
に対応しているんです」
solarplexuss「ほええ?」
ソーラー「&は
オペレータ(演算子)
で
AND演算を行うために用いられる演算子なんです
つまり
key & PAD_INPUT_UP
は
AND演算という計算が行われているんです」
solarplexuss「AND演算?」
ソーラー「
int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);
が実行されるまえに
ジョイパッド1からの何かのボタンが入力されていると
GetJoypadInputState(DX_INPUT_KEY_PAD1)
の実行の際
GetJoypadInputState(DX_INPUT_KEY_PAD1)には戻り値として
ジョイパッド1の何かのボタンに対応した数値が返されることになるよね
だから
int key=GetJoypadInputState(DX_INPUT_KEY_PAD1);
の実行により
int型の変数keyにはGetJoypadInputState(DX_INPUT_KEY_PAD1)に返された戻り値(整数値)
が
代入されることになります
そう
keyには整数値が代入されているんです
そして
次は
key & PAD_INPUT_UP
の
PAD_INPUT_UP
に注目だね
PAD_INPUT_UP
には
もとから
(ジョイパッドの十字キー(キーボード)の右ボタンに対応する)
ある整数値が割り当てられています(代入されています)
つまり
key & PAD_INPUT_UP
は
整数&整数
をあらわしているんです
整数&整数
は
&演算子によって
整数値同士の
AND演算(計算)が行われているんです」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます