バイトのビットがオンになっているかどうかを確認するための標準的な解決策はありますか? 考えられる解決策はたくさんあります。たとえば、次のとおりです。
value = ( reg & 0x20 ) == 0x20;
value = ( reg & 0b00100000 ) == 0b00100000;
value = ( reg >> 5 ) & 1;
明確化:私はさらなる可能性について尋ねていたのではなく、標準的な解決策があるかどうかを尋ねていました.
value = reg & 0x20
C ではゼロ以外の値はすべて true として評価されるため、ほとんどの状況ではこれで十分です。
0b00100000
のようなバイナリ形式は標準 C ではなく、gcc などの一部のコンパイラの拡張であることにも注意してください。
二重の 'not' を使用して、代入を安全 (0
または1
のみ)にすることができます。
value = !!(reg & 0x20); // !! forces any non-zero value to 1
代入 ( if
、while
、for
、 ... での使用) が必要ない場合は、このトリックは必要ありません。ゼロ以外の値はTRUE
すべて -condition と等しくなります。
while(reg & 0x20)
標準的な方法は次のようになります
(reg & 0x20u) > 0
リテラルのu
最後にある により、符号付き数値に対してビット演算を実行しないことが保証されます (reg が char または short 型の場合に実行します)。ビット演算と符号付き数値を混在させないでください。
これ> 0
により、可能な限り単純な方法で、本質的にブール型の結果が得られます。
一般的な方法は、ビット マスクを使用することです。
is5bit_on = reg & 0x20;
注: 1 ビットのみをチェックする場合と比較reg & 0x20
する必要はありません。0x20
マジック ナンバーをできるだけ避け、C99 ブール値を使用する場合は、
enum { SOME_FLAG = 1 << 5 };
_Bool has_some_flag = reg & SOME_FLAG;