Fecha y hora actual: Sábado 24 Ago 2019 05:29
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

Campos de bit[lenguaje C]

Responder al Tema Ir a página 123Siguiente

Índice del Foro > C, C#, Visual C++ > Campos de bit[lenguaje C]

Autor Mensaje
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Domingo 08 Jun 2014 22:17

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola a todos.
Alguien sería tan amable de explicarme cómo funciona el siguiente programa, no les puedo decir cuál es la duda específica porque justamente estoy en el capitulo estructuras, uniones, campos de bit y lamentablemente en el manual con el que estoy estudiando no lo explica paso a paso, me refiero en especial a este programa.-
Siempre me intrigo la utilidad especifica de los campos de bit, es por eso mi consulta.-

Código:
  1. #include <stdio.h>
  2.  
  3. #define mayus(ch) ((ch>='a' && ch<='z') ? (ch+'A'-'a') : ch)
  4.  
  5. typedef struct{
  6. unsigned int a: 1;
  7. unsigned int b: 1;
  8. unsigned int c: 1;
  9. unsigned int d: 1;
  10. unsigned int e: 1;
  11. unsigned int f: 1;
  12. unsigned int g: 1;
  13. unsigned int h: 1;
  14. }byte;
  15.  
  16. union charbits{
  17. char ch;
  18. byte bits;
  19. }caracter;
  20.  
  21. void decodifica(byte b);
  22.  
  23. int main(void){
  24. printf("\n\n ----- Teclea caracteres. Para salir car%ccter X -----\n\n", 160);
  25.  
  26. do {
  27. caracter.ch = getchar();
  28. printf (" : ") ;
  29.  
  30. decodifica(caracter.bits);
  31.  
  32. }while(mayus(caracter.ch) !='X');
  33.  
  34. return 0;
  35. }
  36.  
  37. void decodifica(byte b){
  38. printf("%2u%2u%2u%2u%2u%2u%2u%2u \n", b.h, b.g, b.f, b.e, b.d, b.c, b.b, b.a);
  39. }


Saludos.-
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
unsigned char*
Usuario Activo


Registrado: 03 Abr 2012
Mensajes: 599
Ubicación: Aqui

Mensaje Publicado: Domingo 08 Jun 2014 23:34

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

El programa usa la estructura 'byte' para representar 1 byte.. truncando el espacio reservado para los enteros de 4 bytes a 1 bit.. luego define la union 'charbits', las uniones son como estructuras pero con la diferencia de que los miembros ocupan el mismo espacio de memoria.. entonces cuando el usuario intriduce un caracter y se hace...
Código:
caracter.ch = getchar();

lo que se esta haciendo es rellenando tanto 'char ch' como 'byte bits' al ser hipoteticamente "sizeof(byte)=sizeof(char)=1byte" se rellena toda al estructura 'byte' (a 1bit,b 1bit,c 1bit,d 1bit,e 1bit, f 1bit, g 1big, h 1bit)...

Al final imprime el valor binario del caracter.

Pongamos un ejemplo:
El usuario introduce 'M', el valor binario de 'M' es '1001101' represetando en un 1byte (char) '01001101'.. hemos dicho que una union emplea el mismo espacio de memeria para todos sus miembros... asique tambien se agina.. a la estrucutra byte:
a = 1
b = 0
c = 1
d = 1
e = 0
f = 0
g = 1
h= 0

imprimimos: 01001101


++++++++++[>++++++++>++++++++>++++>+++<<<<-]>+++++.>--.<--.>-----.--.+++++++.---------.-.>>++.<<-.+++++.-------.<-.>>++.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Lunes 09 Jun 2014 00:05

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola unsigned char*.-
Te doy las gracias por responder, la verdad no entendí un pomo y lo peor es que ni siquiera puedo hacerte una consulta porque estoy tildado con este tema, lo voy a repasar todas las veces que sea necesario y seguramente me caerá la ficha.- Ojos

Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
unsigned char*
Usuario Activo


Registrado: 03 Abr 2012
Mensajes: 599
Ubicación: Aqui

Mensaje Publicado: Lunes 09 Jun 2014 10:21

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Igual soy yo que me explico como el culo Risa al decirlo con mis palabras y no usar tecnicismos puedo dar pie a mas lio... lo siento.

Lo intentare asi...

la union charbits todos sus miembros apuntan a la misma direccion de memoria... ¿y cuanto ocupa una union? Lo que ocupe su miembro mas pesado. ¿Que quiere decir esto? que puedes acceder a ese area de memoria tanto por "ch" (caracter.ch) como por "bits" (caracter.bits)... con esto dicho ya te das cuenta que las uniones pueden dar resultados imprevistos... en este caso no sucede porque todos los miembros de la union necesitan el mismo espacio de memoria... char ocupa 8bits y byte tambien ocupa 8bits... asique cuando setees alguno de los dos miembros el otro podra representar correctamente su valor.

Si ponemos 'M' que represantado en 1 byte (8 bits) [lo que ocupa un char] es: '01001101', cuando asignamos a caracter.ch la 'M' estamos relleneando ese espacio de memoria que comparten tanto "ch" como "bits"... y bits ocupa 8 bits (ya que hemos truncado el espacio de sus 8 miembros a 1 bit).


char = 'M' (01001101)
bits
a = 1
b = 0
c = 1
d = 1
e = 0
f = 0
g = 1
h = 0

si tu cambias 'caracter.bits.d = 0' veras que al imprimir 'caracter.ch' el valor no sera 'M'.. porque al compartir el mismo area de memoria bits y ch estas cambiando lo que ch muestra.


++++++++++[>++++++++>++++++++>++++>+++<<<<-]>+++++.>--.<--.>-----.--.+++++++.---------.-.>>++.<<-.+++++.-------.<-.>>++.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Lunes 09 Jun 2014 11:35

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Habría que ver qué parte no entiende. En ese programa hay dos cosas, las uniones y las estructuras de campos de bits.

Una unión es como una estructura, sólo que, sus elementos, en vez de ir seguidos en la memoria empiezan todos en la misma posición.

Por ejemplo
Código:
[code]struct charbits{
    int numero;
    char ch;
    double coma;
    byte bits;
}caracter;
 [/code]

estaría primero el int numero, ocupando 4 posiciones. Esas 4 posiciones más allá estaría el char ch. En la posición de memoria siguiente estaría el double coma. Y 8 posiciones después el byte bits. Así que quedaría en la memoria algo como

int numero - char ch - double coma - byte bits

uno detrás de otro, ocupando en total 12 bytes.


Código:
union charbits{
    int numero;
    char ch;
    double coma;
    byte bits;
}caracter;
 


Ahí en cambio no haría eso. No irían todos seguidos en la memoria, sino que empezarían todos en la misma, la inicial. int numero empezaría en la inicial, char ch también empezaría en la inicial, double coma también, y todos así, solapándose todos, de manera que si cambias el valor de char ch, como esa posición de memoria pertenece a todos los demás campos de la unión cambias el valor de todos.

Quedaría algo como

int numero; -
char ch; -
double coma; -
byte bits; -

Lo que consigues con eso es tener una zona de la memoria a la que puedes acceder como un int, como un char, como lo que sea.

Una estructura de campos de bits es eso, una estructura en la que cada campo es un bit o unos cuantos, los que le digas. En el ejemplo cada campo es un bit (: 1), y como en total son ocho campos, es un byte, un char. Si le pasas al char de la unión que hace un char con el campo de bits un cierto valor, se lo estás pasando también al campo de bits, con lo que tienes el binario de ese char.

http://www.zator.com/Cpp/E4_6.htm

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Lunes 09 Jun 2014 22:45

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola a todos.-
Muchas gracia a ambos por ayudarme, ya estoy a punto de interpretar como funciona el programa (gracias al post de Uds.), sólo me queda la duda principal que radica como se interrelacionan en este caso la estructura y la unión, pero por el momento me gustaría que lo dejemos en este punto para ver si puedo descubrirlo por mí mismo, si esto no ocurre los consultare nuevamente.-

unsigned, mil disculpas amigo por expresarme tan mal y no hacerme entender, cuando dije “no entendí un pomo” no me refería a tu explicación sino a mi falta de claridad mental para interpretar lo que exponías, además gracias nuevamente porque otro en tu lugar me hubiera rep……. (aunque mas no sea de forma encubierta)-

Saludos.
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Martes 10 Jun 2014 19:37

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola a todos.-
Bueno al fin me parece que estoy muy cerca de interpretarlo todo, sólo les pido un empujoncito mas, me podrían completar el último globo, por más que repaso los post de Uds. no logro terminarlo.-
Esta manera es con la que más recuerdo lo estudiado, me da muchos resultados, casi todo lo programas de ejemplos los guardo así.-



Saludos y nuevamente muchas gracias.- Ok
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Martes 10 Jun 2014 19:55

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

La función descodifica recibe una estructura byte, que tiene el mismo valor que el char ch. Como byte es un campo de bits de un bit cada campo, está asignado un valor int de 0 o 1 dependiendo del valor de cada bit de ch. Así que b.a valdrá 1 si el primer bit de ch es uno y 0 si es 0, y así con todos los bits de ch. Y eso imprime. Se va a explotar el globo.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Martes 10 Jun 2014 20:35

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Gracia Pico.-
Si no me hiciste ninguna observación con el resto debo suponer que esta medianamente acertado.-
El globo no explotó pero me tapa toda la imagen.- Risa Reir

Saludos y gracias.-
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Martes 10 Jun 2014 20:59

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Sí, el resto está bien. No te preocupes que mañana ya lo entiendes todo bien.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Jueves 12 Jun 2014 18:04

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola a todos.-
Dejo un ejemplo más de lo que se puede hacer con los campos de bit (en mi caso parece que lo tengo entendido) lo que hace el programa es pasar una letra de minúscula a mayúscula.-

Código:
  1. #include <stdio.h>
  2.  
  3. union caracteres{
  4.  
  5. unsigned char c;
  6.  
  7. struct c_bits {
  8. unsigned b0:1;
  9. unsigned b1:1;
  10. unsigned b2:1;
  11. unsigned b3:1;
  12. unsigned b4:1;
  13. unsigned b5:1;
  14. unsigned b6:1;
  15. unsigned b7:1;
  16. } bits;
  17. };
  18.  
  19. int main(void){
  20. union caracteres caracter = {110};
  21.  
  22. printf("\n\n union caracteres caracter = {110};");
  23. printf("\n\n La variable caracter contiene la letra...: \"%c\"", caracter.c);
  24.  
  25. printf("\n\n caracter.bits.b5 = 0; //Apaga el bits 5 para que la letra 'n' se transforme en 'N'");
  26. caracter.bits.b5 = 0;
  27. printf("\n\n Ahora la variable caracter contiene la letra...: \"%c\"", caracter.c);
  28.  
  29. printf("\n\n");
  30. return 0;
  31. }
  32.  
  33.  

En la página del programa tenia la siguiente nota:

Cita:
Un problema con ese programa es asumir que el tipo unsigned int esta constituido por 32 bits (si son mas el resultado es incorrecto, si son menos el programa reventara por el desplazamiento).
Una mejor aproximación consiste en utilizar el operador sizeof para obtener el número de bytes y la macro CHAR_BIT para el número de bits:


El caso es que no tenía implementado la inclusión de sizeof y CHAR_BIT, si Uds. creen que esto lo hace al programa no transportable, ¿me podrían dar algún ejemplo de cómo implementar la macro y el operador ?.-

Saludos.-
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Jueves 12 Jun 2014 20:49

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Creí que era un programa tuyo.

Yo no acabo de ver el problema de definir unsigned al campo de bits para ser portable. Veo antes el de considrar que entre los caracteres mayúsculas y minúsculas tenga que haber 32 posiciones en una tabla. Eso es así en la tabla ascii, pero un sistema que no use esa tabla...

Y si es problema, creo que la mejor solución sería definir cada campo como byte. Ese tamaño sí debe ser común a cualquier plataforma.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Jueves 12 Jun 2014 21:02

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

No sé si tienes claro lo de las uniones, pero un ejemplo con el que se ve muy claro su funcionamiento es:
Código:
union numero
{
    unsigned int entero;
    struct
    {
        byte d;
        byte c;
        byte b;
        byte a;
    }bytes;
};

    union numero n;
    n.entero= 0x11223344;

n.a=0x11
n.b=0x22
n.c=0x33
n.d=0x44

Volver arriba
Ver perfil del usuario Enviar mensaje privado
DanielC
Usuario Inquieto


Registrado: 27 Ene 2009
Mensajes: 133
Ubicación: Arequito - Santa Fé - Argentina

Mensaje Publicado: Sábado 14 Jun 2014 00:29

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Hola Pico.-
Estoy peor que Maravilla Martínez en la pelea con cotto Sueño , el primer post dejémoslo hay por el momento (no entiendo nada) si me interesa el segundo, trate de compilar el código y me da una infinidad de errores, la consulta es, ¿ byte es un tipo de dato?.-

Código:
#include <stdio.h>

union numero{
   unsigned int entero;
   
   struct{
      byte d;
      byte c;
      byte b;
      byte a;
    }bytes;
};

int main(void){
   union numero n;
   n.entero = 0x11223344;

   printf("\n %d", n.a);

   return 0;   
}


Saludos.-
Daniel


abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Pico
Usuario Activo


Registrado: 25 Jun 2013
Mensajes: 628

Mensaje Publicado: Sábado 14 Jun 2014 08:55

Título del mensaje: Campos de bit[lenguaje C]

Responder citando

Es un tipo de dato cuando está definido, y en los compiladores de c no suele estarlo (o no lo está nunca)

Pero no hay problema, cuando está definido lo está como

Código:
typedef unsigned char byte;


así que se cambia el byte por unsigned char y arreglado.

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema Ir a página 123Siguiente
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda urgente con tarea de programa en lenguaje C

dominicanvictor C, C#, Visual C++ 0 Lunes 05 Ago 2019 18:04 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Traducir algoritmo a lenguaje pascal!

Carlos bayona Programación en general 2 Lunes 01 Jul 2019 20:21 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Debate: ¿Cual es el mejor lenguaje de programac...

Samuel Martinez Programación en general 2 Lunes 10 Jun 2019 09:06 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Necesito ayuda en este codigo en lenguaje c

EmmanuelTR9 C, C#, Visual C++ 0 Lunes 08 Oct 2018 18:38 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,