2011-06-21 22 views
5

ここで少し混乱してしまいます。Arduinoとビットワイズ、予期しない結果

ビット(3ビット)のセットに特定の位置のビットが含まれているかどうかをテストしたいと思います。

if (B110 & B010 == B010) 

(B110数がチェックしている、B010私があるかどうかを確認したいビット)上記のコードは、両方のB110がtrueで、B101は、来て期待を私に与えていません

本当。私は、マスクB010でテストするために&(および)を使用する必要があると確信しています。

私の理解では、B110 & B010はB010と等しく、B101 & B010はB000と等しくなります。しかし、私のif文は両方のテストビットで実行されますか?

私はArduinoでコーディングしていますが、私はそれが私の代わりに簡単な誤解であるとは確信しています。

+1

私は助けてくれることができませんでした。 – fuzz

答えて

12

は常にtrueになり、それがif (B110 & (B010 == B010))として実行している現時点では

if ((B110 & B010) == B010)を試してみてください。 this tableショー、==として

=&よりも高い優先順位を持っています!|など

+0

はい、まさに私が言っていたことですが、私は、theuが==よりも強くない強いCのデザイナーのことを完全に狂っていると付け加えることができ、Lispのように見えるように十分なカッコでコードを捨てるようにしました。 –

+0

@ dren Absolutely;)一般的な経験則として、私がIFで計算をしているのなら、私はいつも自分のカッコで計算します。 – Majenko

+2

疑問が残っている場合は、余分な括弧を使用します。私は演算子の優先順位はわかりませんが、コンパイラが括弧に従うことを知っています。 – blalor

3

このテストでは、実際には「== B010」は不要です。 Cでは、0は「偽」を表し、0以外の値は「真」とみなされます。 B110 & B010(またはそのビットが設定された他の値)はB010を返します。これは0と等しくないため、テストは成功します。