elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Convertir de decimal a binario en lenguaje C.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Convertir de decimal a binario en lenguaje C.  (Leído 6,283 veces)
NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Convertir de decimal a binario en lenguaje C.
« en: 7 Noviembre 2016, 15:01 pm »

Hola, ¿cómo están?
Este programa de Ej. lo saque de este hilo http://foro.elhacker.net/programacion_cc/de_decimal_a_binario_sumando_solo_los_bits_encendidos_c-t430055.0.html(soy el mismo usuario) y ahora repasando lo aprendido me doy cuenta de que la variable bit es una mascara para 29 posiciones y no 32 como seria lo correcto (con unsigned), alguien me podría decir cuál es el error. -

Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3.  
  4. int main( void ){
  5. unsigned int numero = 42949, i=0;
  6. unsigned int bit = 1U << sizeof(unsigned) * (CHAR_BIT - 1) ;
  7.  
  8. while ( bit ){
  9.    putchar(numero & bit ? '1' : '0');
  10.    bit >>= 1;
  11.    if( i%4 == 0 ) putchar(' ');
  12.    i++;
  13. }
  14. puts("");
  15.  
  16. return 0;
  17. }

Citar
  daniel@daniel-H81M-S1:~/Escritorio/Lanzadores/Proyecto actual$ ./repaso
 0 0000 0000 0000 1010 0111 1100 0101
 daniel@daniel-H81M-S1:~/Escritorio/Lanzadores/Proyecto actual$

Saludos y muchas gracias desde ya. -


En línea

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.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #1 en: 7 Noviembre 2016, 15:45 pm »

Quisiste decir:
Código
  1. i = 1;
y
Código
  1. unsigned int bit = 1U << (sizeof(unsigned) * CHAR_BIT - 1);


« Última modificación: 7 Noviembre 2016, 15:47 pm por MAFUS » En línea

4dr14n31t0r

Desconectado Desconectado

Mensajes: 85



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #2 en: 7 Noviembre 2016, 15:50 pm »

A primera vista y sin revisar mucho tu codigo, diria que tu fallo esta en esta linea:
Código
  1. unsigned int bit = 1U << sizeof(unsigned) * (CHAR_BIT - 1) ;
ya que sizeof no devuelve la cantidad de bits que ocupa un tipo, sino la cantidad de bytes, que no es lo mismo.
1 byte = 8 bits.
En línea

NOB2014


Desconectado Desconectado

Mensajes: 366



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #3 en: 7 Noviembre 2016, 16:03 pm »

Si genio, ahora funciona correctamente. -
Una cosita mas, cuando estés muy aburrido, dedícame unos minutos de tu tiempo y explícanos paso a paso la declaración de la variable bit. - 

Un abrazo y muchas gracias. -
En línea

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.-
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #4 en: 7 Noviembre 2016, 17:05 pm »

Claro.
Supongamos que CHAR_BIT vale 8. En algunas máquinas el char puede ser de 7 bits, con lo que el programa fallaría. Así que sería mejor sustituir esa parte por un 8 para hacerla más portable.

Hay que encender solamente el bit más significativo y para ello se moverá un 1 tantas posiciones a la izquierda como sea necesario: 1 <<

sizeof da la cantidad de bytes de un tipo, pero el operador << mueve una cantidad de bits y para transformar cantidad de bytes en catidad de bits se multiplica por 8. Quedará así 1 << sizeof(unsigned) * 8

Pero haciéndolo así nos salimos, por una sola posición, de las dimensiones del dato, en realidad hay que ir un bit a la derecha así que la operación se convierte en 1 << sizeof(unsigned) * 8 - 1.



En línea

SebaC

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #5 en: 7 Noviembre 2016, 19:33 pm »

Claro.
Supongamos que CHAR_BIT vale 8. En algunas máquinas el char puede ser de 7 bits, con lo que el programa fallaría. Así que sería mejor sustituir esa parte por un 8 para hacerla más portable.

Si CHAR_BIT es 8 cual es la diferencia entre usar CHAR_BIT y la  constante 8 si ambos son lo mismo.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #6 en: 7 Noviembre 2016, 19:40 pm »

CHAR_BIT es una de esas constantes que se usan para hacer portable el código en diferentes máquinas.

Hay procesadores que pueden usar los antiguos char de 7 bits. En ellos la constante CHAR_BIT valdría 7.
En línea

SebaC

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #7 en: 7 Noviembre 2016, 19:54 pm »

Te contradices primero recomiendas usar la constante 8 en lugar de CHAR_BIT por cuestiones de portabilidad, pero ahora dices

Citar
CHAR_BIT es una de esas constantes que se usan para hacer portable el código en diferentes máquinas.

CHAR_BIT es una macro con un valor fijo no puede tomar otro valor
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Convertir de decimal a binario en lenguaje C.
« Respuesta #8 en: 7 Noviembre 2016, 21:53 pm »

CHAR_BIT es una macro que depende de la biblioteca estándar de C, está en la librería limits.h
Estas macros, como ya he dicho, están pensadas para ayudar a la portabilidad de código pues hacen que no se deba modificar de una plataforma a otra aún si las especificaciones son diferentes.

De hecho para una máquina que trabaje con caracteres de 7 bits, en su biblioteca asociada a su lenguaje C, te encontrarás con que CHAR_BIT tiene el valor 7, mientras que en un moderno computador de sobremesa, en su biblioteca tendrá definido CHAR_BIT con el valor 8.

No existen unos valores invariables, para todas las arquitecturas del mundo, de las macros de la biblioteca de C, más sabiendo que es un lenguaje dependiente de la arquitectura. Las macros estarán definidas para encajar con esa arquitectura para la que está pensada esa biblioteca.

Es más, si usaras números mágicos en tus programas te encontrarías con un archivo fuente que te funciona bien en un sitio, y sin embargo lo portas a otra máquina diferente y te falla.

limits.h existe precisamente para esto. Un entero int no tiene un tamaño igual en un procesador de 32 bits que en un de 8. Así mediante dicha librería el programa puede saber si va a exceder el límite del tipo de dato.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines