-1

シャッフル後にカードの値を表示する必要があるカード ゲームがあります(x >> 1)& 0xf。x が 13 枚のカードのリストを反復する値を使用してカードの値を表示します。ビット 1 ~ 4 はカードの値として検出されます。

上記はカードタイプ

しかし、カードで最高のペアを見つけたとき、それは を使用した場合にのみ機能しますvalues[(afterfindingpairs[a]&0xf0)>>4]

これは、0 ~ 4 ビットがペアの番号であり、4 ~ 7 ビットがペア タイプのバイトのペアの値であるためです。

使用すると、最高のペアがエースとして表示されるだけです

values[(afterfindingpairs[a]&0xf)>>4].

16 進数の 0xf0 は、ペア タイプの 4 ~ 7 の間の 4 ビットではなく、8 ビットを処理しないのではないかと混乱してvalues[(afterfindingpairs[a]&0xf)>>4]います。

なぜこれが起こるのかについての説明をいただければ幸いです。

4

1 に答える 1

3

さまざまな範囲のビットを抽出して、8 ビット値を操作したいようです。ただし、場合によっては、すべてのビットを破棄するような方法でそうしています。

8 ビットは、最下位 (ビット 0、10 進数で「1」) から最上位 (ビット 7、10 進数で「128」) に配置されます。

したがって、2 進数の10010110場合、これは数値 (128 + 16 + 4 + 2)、または 150、または 16 進数の 0x96 を表します。

このような数値に右シフトを適用すると、ビットは適切な桁数だけ右に移動します。したがって、>>4上記の数値を実行すると、結果は00001001- または 9 になります。ここでは符号なしの値を扱っていると想定しているため、上位ビットは「0」で埋められます。その結果、元のビット 4 ~ 7 がビット 0 ~ 3 になり、元のビット 0 ~ 3 が破棄されていることに注意してください。

2 つの数値の場合and、両方に設定されているビットのみが結果に設定されます。したがって、これは効果的にビットをマスキングしています。でマスクする場合0xf0、これはバイナリ11110000であるため、上位ビット 4 ~ 7 のみが結果に残り、下位ビット 0 ~ 3 はゼロに設定されます。

あなたの声明を見てください:

values[(afterfindingpairs[a]&0xf0)>>4]

上記の私の説明によると、式afterfindingpairs[a]&0xf0はビット 0 ~ 3 をゼロに設定し、ビット 4 ~ 7 を保持します。

式の次の部分は、>>4これらの残りのビットを下にシフトして、結果のビット 0 ~ 3 にします。これにより、元のビット 0 ~ 3破棄され、前のマスク操作が冗長になることに注意してください ( 8 ビット値を扱っていない場合を除きます...)。

あなたの他の声明:

values[(afterfindingpairs[a]&0xf)>>4]

もっと問題です。最初にマスク ( 0xf) を適用すると、ビット 0 ~ 3 のみが保持され、他のすべてがゼロに設定されます。次に、ビット 4 ~ 7 (既にゼロになっている) をその場所にシフトダウンすることにより、ビット 0 ~ 3 を破棄するシフトを適用します。

つまり、この後者の式は常にゼロです。

于 2013-03-16T09:40:16.230 に答える