私は自分のコードの一部でしばらく苦労してきましたが、最終的に問題は単純なテストにあり、期待した結果が得られないことがわかりました。
if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true
私が理解していないのは、2 行目の結果が false になる理由です。私の理解では、ゼロ以外のすべての整数はテストで真と見なされました。
との間のビット単位2
のandtrue
は false であるためです。
&
(ビット演算子) は (論理演算子) とは異なり&&
ます。
true
キャスト先int
は1
。
どちらが間違っているかはそう2 & true
です-なぜなら. (ビットは異なる場合があります)2 & 1
0000000000000010 & 0000000000000001 == 0
一方bool(2) == 1
、 と1 & 1
はtrue
です。
if (2) //=> true
ここまでは順調ですね。
if (2 & true) //=> false
はビット単位の演算子であり、2 と 1 はそれぞれバイナリで 00000010 と 00000001 である2 & 1 == 0
ため、ここでの条件は に評価されます。&
if (bool(2) & true) //=> true
興味深いことに、私のコンパイラでは、このような場合に異常な動作を思い出すようです。そして、宗派の場合。C++11 標準の 4.12 はこの問題に対処していますが、私には理解できない方法で対処しています。コンパイラーの let を見たことを思い出すようですがbool(2) == 2
、これは予想外でした。これが私のコンパイラのバグなのか、私の記憶の誤りなのか、私にはわかりません。
ただし&&
、ビットごとの演算子ではなく論理演算子が必要だと思います&
。
クイズ
理解度を確認するには、
if (3 & true) //=> true
なぜだか分かりますか?(ヒント: 3 のバイナリ表現は 00000011 です。)
&&
の代わりにが必要です&
。
&&
はブールand
演算子&
ですが、 はバイナリ 'and' なので、 whileと2 & true
同じです。0010 & 0001 = 0000 -> false
2 && true = true
&
すべてのビット間で AND を実行します (ビットごとの AND を呼び出します) 。必要なのは&&
演算子 (ブール AND) です。
バイナリの 2 は '10' で、 true はバイナリの 1 (01) である10 & 01
ため、結果は 0 になります。
bool(2) は 2 を true に変換し、バイナリでは 01 であり、01 & 01
01 です。