メルマガ読者の方より「キーが押されていることを判定するのに 0×8000 と論理積を取るのはなぜか?」と質問がありまして、何かの助けになればと関連情報を載せておこうと思ったところ、訳のわからんことになっております。
MSDN によると、「最上位ビットがセットされたときは現在そのキーが押されていることを示す」とありますので、 GetAsyncKeyState() の戻り値を 32bit Windows 環境における SHORT 型である2バイトと想定し、 0×8000 で論理積を取った次第です。
ビットとか論理積に関しての解説が追いついておりませんので、理解が怪しい方は申し訳ありませんが、次のようなサイトを参照ください。
問題は、ここを 0×80 で比較してる情報が多いことで、「あれ、勘違いしたかな?」と思って実際の戻り値を調べてみました。すると、 0xFF80 となりました。これだと 0×8000 との論理積を if 文で判定しても真になりますし、 0×80 との論理積を if 文で判定しても真になります。
あれ、何だろう、どこで勘違いしてるのかわかりません。戻り値を作るときに負数にしているのでしょうか。
Comments
MSDNによるとGetAsyncKeyStateの戻り値はSHORT。つまり16bitです。
そのため比較すべき値は0×8000でなく、0×0080です。
後はわかると思いますが、実際の戻り値が0×0080でなく0xFF80なのは、
GetAsyncKeyStateの戻り値を32bitの変数に代入したためかと思われます。
最上位bitがセット==負の値ですからね
すみません。よく考えたら0×8000で2バイトでした。アホか俺は
上のコメントは無視してください。申し訳ありませんでした。
いえ、とんでもありません。
コメントいただいてありがとうございます。
私も同じように考えてしまいまして、
「あ!間違ってる!」と「あれ?間違ってるん?」を行き来している次第です。
自分は、この関数をまだ誤解している部分がありそうです。
Contributions