TODOPIC

Lenguajes de programación para PC => C, C#, C++ => Mensaje iniciado por: RinconR en 06 de Abril de 2016, 11:14:30

Título: Leer bit de una variable
Publicado por: RinconR en 06 de Abril de 2016, 11:14:30
Tengo un programa para un PIC donde guardo unos valores en una variable char cada x tiempo.
¿Como puedo consultar en valor de algunos bits de esa variable?
Por ejemplo tengo que:
var= 0b01101100
Y quiero saber el valor del bit 4. ¿Como podría hacerlo?

¡Gracias de antemano!
Título: Re:Leer bit de una variable
Publicado por: KILLERJC en 06 de Abril de 2016, 11:17:42
Depende del compilador..

XC8/CCS/etc:

Código: C
  1. if ( (var & 0x10) == 1)
  2. {
  3. }

CCS

Código: C
  1. if(bit_test(var,4)==1)
  2. {
  3. }

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
Título: Re:Leer bit de una variable
Publicado por: RinconR en 06 de Abril de 2016, 11:39:39
Depende del compilador..

XC8/CCS/etc:

Código: C
  1. if ( (var & 0x10) == 1)
  2. {
  3. }

CCS

Código: C
  1. if(bit_test(var,4)==1)
  2. {
  3. }

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
Gracias. Uso XC8
¿Que es el bit field? No entiendo eso...
¿Porque pones var & 0x10?
Título: Re:Leer bit de una variable
Publicado por: KILLERJC en 06 de Abril de 2016, 12:02:36
Me acabo de dar cuenta que tengo un error.

Código: C
  1. if ( (var & 0x10) == 0)
  2. {
  3. }
  4.  
  5. // o
  6.  
  7. if ( (var & 0x10) != 0)
  8. {
  9. }

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
Título: Re:Leer bit de una variable
Publicado por: DominusDRR en 06 de Abril de 2016, 12:18:03
Tal vez sea útil lo siguiente:

Código: C
  1. unsigned char LeerBit(unsigned char MiByte, unsigned char QueBit)
  2. {
  3.       return ((MiByte >> QueBit) & 0x01);
  4. }

Se lo podría usar así:

Código: C
  1. if (LeerBit(var,6)) //Determino si el bit 6 de var es 1
  2. {
  3.  
  4. }
  5.  
  6.  
  7. if (!LeerBit(var,6)) //Determino si el bit 6 de var es 0
  8. {
  9.  
  10. }
Título: Re:Leer bit de una variable
Publicado por: RinconR en 06 de Abril de 2016, 19:18:31
Me acabo de dar cuenta que tengo un error.

Código: C
  1. if ( (var & 0x10) == 0)
  2. {
  3. }
  4.  
  5. // o
  6.  
  7. if ( (var & 0x10) != 0)
  8. {
  9. }

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

¿Entonces, si cualquier bit del AND es un 1, el IF saldría positivo?
¡Gracias!
Título: Re:Leer bit de una variable
Publicado por: RinconR en 06 de Abril de 2016, 19:19:54
Tal vez sea útil lo siguiente:

Código: C
  1. unsigned char LeerBit(unsigned char MiByte, unsigned char QueBit)
  2. {
  3.       return ((MiByte >> QueBit) & 0x01);
  4. }

Se lo podría usar así:

Código: C
  1. if (LeerBit(var,6)) //Determino si el bit 6 de var es 1
  2. {
  3.  
  4. }
  5.  
  6.  
  7. if (!LeerBit(var,6)) //Determino si el bit 6 de var es 0
  8. {
  9.  
  10. }

¡Gracias! Lo probaré.
Aunque no entiendo esto: ((MiByte >> QueBit) & 0x01);
Título: Re:Leer bit de una variable
Publicado por: MerLiNz en 06 de Abril de 2016, 19:34:43
mibyte >> quebit = desplaza hacia la derecha (>>) (quebit) posiciones. Osea si tienes 11000 y pones (11000 >> 2) obtendras  110. Luego esta el & 0x01 que simplemente hace una operacion AND con un bit '1'. En este caso si tienes 110 & 1 tendras como resultado: 0; ya que 0 & 1 = 0.

Son operaciones con bits. Los >> se llama desplazar, & = AND