マスク ~(~0U >> 1) を使用して、最上位ビットが設定されているかどうかを確認できます。これはあなたのものから適応されたいくつかのコードです:
#include <stdio.h>
int main() {
int addr=0x0fffffff;
unsigned int mask = ~(~0U >> 1);
if (addr & mask) {
printf("Bit is set");
}
else
printf("Bit is not set");
return 0;
}
C は初めてなので、マスクは少し奇妙に見えるかもしれません。ここで何が起こっているか見てみましょう。
~0U は、すべてのビットが 1 に設定された符号なしの数値です。単項 ~ 演算子は、0 のすべてのビットを否定するため、すべてのビットが 1 になります。~0U >> 1 は、すべてを 1 桁分右にシフトするため、(on 32 ビット マシン):
01111111111111111111111111111111
~(~0U >> 1) であるすべてをもう一度否定すると、次のようになります。
10000000000000000000000000000000
これで、最上位ビットのみが設定された数値が得られました。これは、他の数値をテストするためのマスクとして使用されます。
数値のサイズに依存していないため、この種の構造を使用すると移植性があります。~(~0U >> 1) は、int のビット数に関係なく常に機能します。
数値は、右シフト演算子が通常の int で符号拡張を引き起こす可能性があるため、unsigned であると宣言されていますが、これは望ましくありません。符号なしの数値では、右シフトは常に先頭に 0 を挿入します。