さまざまな範囲のビットを抽出して、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 を破棄するシフトを適用します。
つまり、この後者の式は常にゼロです。