第 2 章のビット演算子に関するセクション (セクション 2.9) で、サンプル メソッドの 1 つがどのように機能するかを理解するのに苦労しています。
提供されるメソッドは次のとおりです。
unsigned int getbits(unsigned int x, int p, int n) {
return (x >> (p + 1 - n)) & ~(~0 << n);
}
考え方は、指定された数値x に対して、位置pから始まるnビットを右から数えて返すというものです(右端のビットが位置 0 になります)。次の方法を考えます。main()
int main(void) {
int x = 0xF994, p = 4, n = 3;
int z = getbits(x, p, n);
printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z);
return 0;
}
出力は次のとおりです。
getbits(63892 (f994), 4, 3) = 5 (5)
私はこれの一部を理解していますが、主に私が理解していないビット (しゃれは意図していません) のために、「全体像」に問題があります。
私が特に問題を抱えている部分は、補足部分です: ~(~0 << n)
. xを扱う最初の部分を取得したと思います。私が苦労しているのはこの部分 (そしてマスク) であり、実際にそれらのビットを取得するためにすべてがどのように組み合わされるかです。(コードと calc.exe を使用して結果をチェックすることの両方で、それが実行されていることを確認しました。バイナリ ビューがあることを神に感謝します!)
何か助けはありますか?