2011-10-25 35 views
2

GetAsyncKeyStateを調べた後、WASDキーを使用して画面上で架空の文字を移動するコード例で調べました。GetAsyncKeyStateの戻り値が説明と一致していないようです

は、私は、そのMSDNのページでこれを読んで:

戻り値

タイプ:SHORT

関数が成功すると、戻り値はキー が押されたかどうかを指定しますGetAsyncKeyStateへの最後の呼び出し以降、および キーが現在アップまたはダウンしているかどうかを示します。最上位ビットがセットされている場合

、 キーがダウンして、最下位ビットが設定されている場合、キーは GetAsyncKeyStateの以前の呼び出し後に押されました。

私はトラブルの戻り値の構造を理解することを抱えている:私はあなたが0000000000000000として、バイナリでは、数字のゼロを表すことができたとし、それを通じてので、それはタイプがshortであると言う

、または0x0000(私の知る限り、1桁の16進数は4桁の2進数を表します)。

の最上位ビットは、キーを押したときに設定する必要があります。それは私が言ったビットが設定された場合、番号は次のように見えるだろう、と思います:

:私のプログラムでは、それをよりよく利用するために

1000000000000000 

、私はにその結果、進にそれを変換することによって、それを短縮しました

0x8000 

8は16進数で1000に対応する必要があります。

上記のメカニズムが私のプログラムでは機能していないことがわかりました(GetAsyncKeyState(chr) == 0x8000を実行すると、キーが押されたかどうかに関わらず常にfalseになります)。最初の例をもう一度見ました。 。戻り値は数値-32767と比較されていました.Windows電卓を使用してすぐに16進数に変換すると、値0xFFFFFFFFFFFF8001になります。今、最下位ビットもアクティブであるかどうかをチェックするのに使用されるビットなので、最後の16進数(1)は気にしないでください。しかし、私の場合はそうしたくありません。私はここでは理解できない

ものは次のとおりです。

  1. なぜ、ここでは、1 16進数は4進数を表し、関数の出力値が短い(2バイト)であれば数字は16桁の16進数で表されますか?それらの8バイトではありませんか?
  2. キーが押されている場合、の最上位ビットは1に設定され、1000000000000000ではなく0000000000001000のように見えることがわかりました。私はここで何が欠けていますか?

答えて

3
GetAsyncKeyState(chr) == 0x8000 

です。最上位ビットが設定されているかどうかを確認するには、

!!(GetAsyncKeyState(chr) & 0x8000) 

を使用します。

0xFFFFFFFFFFFF8001は、GetAsyncKeyStateからの実際の戻り値に対応していません。 Windowsの電卓はGetAsyncKeyStateから返された値のサイズを知らないので、64ビットの数値で作業していることを前提としています。設定で上書きすることができます。

+1

何がありますか?表現の前に? –

+2

@GabrieleCirulli:これはboolに変換するための最短方法です。このコンテキストでは、次のようになります。 '(GetAsyncKeyState(chr)&0x8000)!= 0' – ybungalobill

+0

ああ、そうです。ありがとう。 –

3

1 - 戻り値は、16ビット= 2バイトであるSHORTです。

2 - あなたは、16ビットの1000 0000値はなる32ビットINTにキャストした場合に値が署名されているとして、最上位ビットは15日、ある1111 1111 1000 0000(64ビットの世界では変換が1000 0000だろう - >1111 1111 1111 1111 - 1111 1111 1000 0000 )。あなただけの符号付き整数値の最上位ビットをテストしたい場合は、単にゼロにそれを比較:これは間違ったチェックは

if(GetAsyncKeyState(...) < 0) 
{ 
    // Hey, MSB is set here! 
} 
+0

論理的な理由を説明すると、それを0と比較すると最上位ビットがチェックされます。 –

+1

符号付き負の整数は常に最上位ビットが設定されており、正の値は設定されていないためです。ゼロはすべてのビットがゼロに等しい。ゼロとの比較は、MSBをテストするスマートな方法です。 –

関連する問題