Depende del compilador..Gracias. Uso XC8
XC8/CCS/etc:Código: C
if ( (var & 0x10) == 1) { }
CCSCódigo: C
if(bit_test(var,4)==1) { }
En el primer metodo si no tiene optimizaciones puede llegar a producir un codigo medio largo. Lo mejor es usar una union con una estructura para todos los bits ( bit field ) y alli usar ese bit. De esa forma se pasa al menor cdigo posible
Me acabo de dar cuenta que tengo un error.Código: C
if ( (var & 0x10) == 0) { } // o if ( (var & 0x10) != 0) { }
Si estas interesado en el bit 4, es decir este bit: 0001 0000 = 0x10. Si haces una AND de ese valor y tu variable, solo queda el bit ese que tenia el 1.
Tomando 2 ejemplos, con bit4 en 0
0x67 = 0b01100111
0x10 = 0b00010000
AND = 0b00000000
Con el bit 4 en 1
0x77 = 0b01110111
0x10 = 0b00010000
AND = 0b00010000
Es decir que si era 0 te queda en 0, si era 1 te queda en cualquier otro numero
-----------------------------------------------------------
Respecto a los bit field:
https://en.wikipedia.org/wiki/Bit_field
http://www.tutorialspoint.com/cprogramming/c_bit_fields.htm
http://stackoverflow.com/questions/1044654/bitfield-manipulation-in-c
Tal vez sea útil lo siguiente:Código: C
unsigned char LeerBit(unsigned char MiByte, unsigned char QueBit) { return ((MiByte >> QueBit) & 0x01); }
Se lo podría usar así:Código: C
if (LeerBit(var,6)) //Determino si el bit 6 de var es 1 { } if (!LeerBit(var,6)) //Determino si el bit 6 de var es 0 { }