bool test_bit(char variable, int bit) //bit puede ser de 0 a 7
{
if((variable>>bit)&0b00000001) //multiplica por 1 el bit a checar, si es 1 regresa un 1
return 1;
else //si fue cero regresa un cero
return 0;
}
char variable;
bool valor;
...
variable=0b01011010;
//checando bit 1
valor=test_bit(variable,1); //esto va a entregar un 1
Podrías usar lo que se llama una unión en C
typedef union {
unsigned char value;
struct {
unsigned bit0:1;
unsigned bit1:1;
unsigned bit2:1;
unsigned bit3:1;
unsigned bit4:1;
unsigned bit5:1;
unsigned bit6:1;
unsigned bit7:1;
} bits;
} Tmibyte;
bits sería el nombre de la estructura el cual es exigido por algunos compiladores. NO todos, por ejemplo en C18 no hace falta pero en Hitech si.
La forma de usarlo sería algo asi
Tmibyte mivariable;
mivariable.value = 20;
if (mivariable.bits.bit0 ==1 ) { ...}
Y cuantas combinaciones se te ocurran :)
int8 banderas; //Registro
#bit cero = banderas.0 //define el bit o de banderas como "cero"
#bit signo = banderas.1 //define el bit 1 de banderas como "signo"
#bit parid = banderas.2 //etc....
#bit acarr = banderas.3
#bit a_aux = banderas.4
void main()
{
//asignas el valor de cada bit del registro banderas así:
cero=1; //bit 0 se pone a 1
signo=1; //bit 1 se pone a 1
parid=1; //etc...
acarr=1;
a_aux=1;
//puedes consultar el estado de un bit así:
if(acarr==1)
cero=0;
}
Mi duda es si hace falta crear la union, o solo con la estructura me llega.Si no declaras la union y te quedas con la estructura solo accederas a los miembros del campo de bits o a los bits en particular, con la union accedes a un bit en particular o al byte contendedor, tal cual no ejemplifico Maunix.
Con la union puedo hacer como dice Maunix para leer o escribir en la variable entera: mivariable.value = 20;
Pero si no creo la union, podria crear "mivariable" como estructura, y luego hacer mivariable = 20?
De esa manera podria acceder tanto a los bits, como al byte completo, sin tener que crear la union... siempre y cuando sea posible, claro
Hola, justamente un campo de bits permite manejar n bits en forma particular, lamentablemente es uno de los puntos oscuros del estandart ANSI C y por ende poco portable. Y justamente el uso de la union es definir un espacio que es igual al mayor de los miembros, con lo cual en este caso no se desperdicia nada, porque los 8 bits ocupan el mismo byte. Eso lo podes ver en al archivo map que genera el linker y ver como se comparte la memoria.
Saludos !