私は自分のコードの一部でしばらく苦労してきましたが、最終的に問題は単純なテストにあり、期待した結果が得られないことがわかりました。
if (2) //=> true
if (2 & true) //=> false
if (bool(2) & true) //=> true
私が理解していないのは、2 行目の結果が false になる理由です。私の理解では、ゼロ以外のすべての整数はテストで真と見なされました。
との間のビット単位2のandtrueは false であるためです。
&(ビット演算子) は (論理演算子) とは異なり&&ます。
trueキャスト先intは1。
どちらが間違っているかはそう2 & trueです-なぜなら. (ビットは異なる場合があります)2 & 10000000000000010 & 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 -> false2 && true = true
&すべてのビット間で AND を実行します (ビットごとの AND を呼び出します) 。必要なのは&&演算子 (ブール AND) です。
バイナリの 2 は '10' で、 true はバイナリの 1 (01) である10 & 01ため、結果は 0 になります。
bool(2) は 2 を true に変換し、バイナリでは 01 であり、01 & 0101 です。