「値」の範囲は0〜15(可能な値)です。これらの4つの「if」条件はいつ満たされますか? (int)value = 2の場合、これは0010を意味しますか?
if ((int)value & 0x1)
{
//statement here
}
if ((int)value & 0x2)
{
//statement here
}
if ((int)value & 0x4)
{
//statement here
}
if ((int)value & 0x8)
{
//statement here
}
各数値はvalue = b0*2^0 + b1*2^1 + b2*2^2 + b3*2^3 + ...
として表すことができ、各bは0
または1
です(これらは表現のビットです)。 これはバイナリ表現です。
バイナリAND(&
)は、それらのb
ペアをそれぞれ賢く取り、それらに対してANDを実行します。これには次の出力があります。
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
2の累乗(1ビットのみがオン)を使用して、個々のビットを分離してテストできます。
value
が奇数の場合、value & 1
は真です{1、3、5、7、9、11、13、15}。
value & 2
は、value/2
が奇数の場合にtrueになります{2、3、6、7、10、11、14、15}。
value & 4
は、value/4
が奇数の場合にtrueになります{4、5、6、7、12、13、14、15}。
value & 8
は、value/8
が奇数の場合にtrueになります{8、9、10、11、12、13、14、15}。
数値の0x接頭辞は、それが 16進数 として解釈されることを意味します。 0x8までの場合は少し不必要ですが、ビットマスクとして使用されている可能性があるとメンテナに伝えます。
これらのifステートメントは、value
の特定のビットが設定されているかどうかをチェックします。
たとえば、16進値0x4
の右から3番目のビットは1
に設定され、他のすべてのビットは0
に設定されます。 2つの演算子で2項演算子(&
)を使用すると、両方の演算子で1であるビットを除いて、すべてのビットが0
に設定されます。
したがって、value & 0x4
の計算を行うと、value
の3番目のビットが00000000
であるかどうかに応じて、バイナリ00000100
またはバイナリ1
のいずれかを取得します。または0
。最初の式はfalse
に、2番目の式はtrue
に評価されるため、ifブロックは3番目のビットが設定されている値に対してのみ実行されます。
ここで注目すべき2つの興味深い点があります。
まず、これは、整数値の下位4ビットのそれぞれをチェックするための一般的なパターンです。対応するビットが設定されている場合、if条件が満たされます。値2の場合、ビットパターンは確かに0010です。
他のより興味深い質問は、なぜ(int)
キャスト? C++でCキャストを使用するという悪いスタイルは別として、このキャストを必要とする整数値や文字値はありません。 boolは意味がありません。double/ floatは一時的な整数に変換され、リテラル値を使用してenumをテストすることは珍しいでしょう。ポインターを使用することで理にかなっている可能性がありますが、それは非常に特殊な用途です。結論:キャストは意味をなしません。