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進数に直した時の同じ位同士💖💖💖💖💖💖💖💖💖💖💖💖💖💖の数が掛け合わされて😊


新たな整数値(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演算(計算)が行われているんです」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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