web-dev-qa-db-ja.com

「(int)値&0x1、(int)値&0x2、(int)値&0x4、(int)値&0x8」はどういう意味ですか? "

code

「値」の範囲は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
            }
11
patr

各数値は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までの場合は少し不必要ですが、ビットマスクとして使用されている可能性があるとメンテナに伝えます。

12
ratchet freak

これらのifステートメントは、valueの特定のビットが設定されているかどうかをチェックします。

たとえば、16進値0x4の右から3番目のビットは1に設定され、他のすべてのビットは0に設定されます。 2つの演算子で2項演算子(&)を使用すると、両方の演算子で1であるビットを除いて、すべてのビットが0に設定されます。

したがって、value & 0x4の計算を行うと、valueの3番目のビットが00000000であるかどうかに応じて、バイナリ00000100またはバイナリ1のいずれかを取得します。または0。最初の式はfalseに、2番目の式はtrueに評価されるため、ifブロックは3番目のビットが設定されている値に対してのみ実行されます。

5
Philipp

ここで注目すべき2つの興味深い点があります。

まず、これは、整数値の下位4ビットのそれぞれをチェックするための一般的なパターンです。対応するビットが設定されている場合、if条件が満たされます。値2の場合、ビットパターンは確かに0010です。

他のより興味深い質問は、なぜ(int)キャスト? C++でCキャストを使用するという悪いスタイルは別として、このキャストを必要とする整数値や文字値はありません。 boolは意味がありません。double/ floatは一時的な整数に変換され、リテラル値を使用してenumをテストすることは珍しいでしょう。ポインターを使用することで理にかなっている可能性がありますが、それは非常に特殊な用途です。結論:キャストは意味をなしません。

1
david.pfx