0

バイトのビットがオンになっているかどうかを確認するための標準的な解決策はありますか? 考えられる解決策はたくさんあります。たとえば、次のとおりです。

value = ( reg & 0x20 ) == 0x20;
value = ( reg & 0b00100000 ) == 0b00100000;
value = ( reg >> 5 ) & 1;

明確化:私はさらなる可能性について尋ねていたのではなく、標準的な解決策があるかどうかを尋ねていました.

4

5 に答える 5

4
value = reg & 0x20

C ではゼロ以外の値はすべて true として評価されるため、ほとんどの状況ではこれで十分です。

0b00100000のようなバイナリ形式は標準 C ではなく、gcc などの一部のコンパイラの拡張であることにも注意してください。

于 2013-09-27T06:43:17.177 に答える
1

二重の 'not' を使用して、代入を安全 (0または1のみ)にすることができます。

value = !!(reg & 0x20); // !! forces any non-zero value to 1

代入 ( ifwhilefor、 ... での使用) が必要ない場合は、このトリックは必要ありません。ゼロ以外の値はTRUEすべて -condition と等しくなります。

while(reg & 0x20)
于 2013-09-27T06:49:33.020 に答える
1

標準的な方法は次のようになります

(reg & 0x20u) > 0

リテラルのu最後にある により、符号付き数値に対してビット演算を実行しないことが保証されます (reg が char または short 型の場合に実行します)。ビット演算と符号付き数値を混在させないでください。

これ> 0により、可能な限り単純な方法で、本質的にブール型の結果が得られます。

于 2013-09-27T06:45:24.113 に答える
0

一般的な方法は、ビット マスクを使用することです。

is5bit_on = reg & 0x20;

注: 1 ビットのみをチェックする場合と比較reg & 0x20する必要はありません。0x20

于 2013-09-27T06:41:23.963 に答える
0

マジック ナンバーをできるだけ避け、C99 ブール値を使用する場合は、

enum { SOME_FLAG = 1 << 5 };
_Bool has_some_flag = reg & SOME_FLAG;
于 2013-09-27T07:29:01.963 に答える