2011-06-21 17 views
5

Estoy un poco confundido aquí.Arduino y Bitwise, resultado inesperado

Me gustaría comprobar si un conjunto de bits (3 bits) contiene un bit en una determinada posición.

if (B110 & B010 == B010) 

(B110 es el número de cheque, el bit B010 Quiero ver si está allí)

El código anterior no me está dando la espera venir a cabo, tanto B110 y B101 es cierto es cierto. Estoy bastante seguro de que necesito usar un & (y) para probar con la máscara B010.

Tengo entendido que B110 & B010 sería igual a B010 y que B101 & B010 equivaldría a B000. Pero mi sentencia if se ejecuta con ambos bits de prueba?

Estoy codificando en un Arduino, estoy seguro de que es un simple malentendido en mi nombre, pero no estoy seguro de dónde.

+1

No pude evitar reírme del juego de palabras. – fuzz

Respuesta

12

Trate if ((B110 & B010) == B010)

En el momento en que se está ejecutando como if (B110 & (B010 == B010)) que siempre será cierto. !

Como this table espectáculos, == y = tienen una prioridad más alta que &, | etc.

+0

Sí, exactamente lo que estaba por decir, solo puedo agregar que es completamente loco de los diseñadores de C que no haya sido creado y más fuerte que ==, lo que nos obliga a guardar nuestro código con suficientes paréntesis para que parezca lisp. –

+0

@dren Absolutamente;) Como regla general, si estoy haciendo un cálculo en un IF I * siempre * pongo el cálculo entre paréntesis. – Majenko

+2

Si alguna vez hay alguna duda, uso paréntesis adicionales. No sé la precedencia de los operadores, pero * sé * que el compilador obedecerá a los parientes. – blalor

3

El "== B010" no es necesario en esta prueba. En C, 0 representa "falso", mientras que cualquier valor distinto de cero se considera "verdadero". B110 & B010 (o cualquier otro valor con ese conjunto de bits) devolverá B010, que no es igual a 0, por lo que la prueba se realiza correctamente.