elrincondelc.com
Inicio :: Foros
Usuario: Clave: Regístrate
Salir


representar un entero en binario
Ir a página 1, 2  Siguiente
 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
incognitamari



Registrado: 05 Mar 2008
Mensajes: 17

MensajePublicado: 19/07/2008 2:16 pm Responder citando
Título: representar un entero en binario

¡Hola! quiero representar un entero por su representación binaria y no sé cómo, ya sé que con fwrite se puede pero en un fichero y yo quiero verlo por pantalla, además debería ser lo más eficiente (en cuanto a tiempo) posible.
Muchas gracias por adelantado que luego se me olvida!.
Volver arriba
Ver perfil del usuario Enviar mensaje privado
polly



Registrado: 19 Jul 2007
Mensajes: 618

MensajePublicado: 19/07/2008 2:59 pm Responder citando
Título:

Tengo una posible solucion , ademas creo que es eficiente , ya que solo utiliza los digitos que son necesario para representar el numero :

Código:

#include <stdio.h>

void binario ( int n);

int main()
{
      int numero;

      printf ("Introduce un numero: ");
      scanf ("%d", &numero);

      binario (numero);
      printf ("\n");

      return 0;
}

void binario ( int n )
{
      if ( n != 0)
      {
            binario ( n / 2);
            printf ("%d", n % 2);
      }
}


Espero que te sirva
_________________
enrmarc
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
rir3760



Registrado: 01 Oct 2004
Mensajes: 7472
Ubicación: Mexico

MensajePublicado: 19/07/2008 3:51 pm Responder citando
Título:

Una buena opcion es utilizar el motor de busqueda de estos foros, deben existir por lo menos una docena de temas donde se trata la impresion de numeros representados en distintas bases.

En cuanto a eficiencia esta importa poco (o nada) para este tipo de operaciones siendo la mayor prioridad la claridad del codigo fuente.

En todo caso la forma mas eficiente es la que utiliza los operadores de desplazamiento de bits.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
incognitamari



Registrado: 05 Mar 2008
Mensajes: 17

MensajePublicado: 20/07/2008 1:21 am Responder citando
Título:

¡Muchas gracias!
Volver arriba
Ver perfil del usuario Enviar mensaje privado
elpre



Registrado: 30 Sep 2008
Mensajes: 38

MensajePublicado: 23/10/2008 3:40 am Responder citando
Título:

Este es mi primer mensage, ya que hace poco que he empezado a andar con c.
Ya he echo algunos programas, bastante sencillos, tal como el de pasar a binario, lo he echo de forma simple, y rellenando con 0 segun los bits que le digas que quiere. Ahora quiero hacer eso mismo, pero con los operadores de bit, vamos, creo que hay que poner && y cosas de esas pero no tengo ni idea de como.
Un saludo
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
cheroky



Registrado: 22 Sep 2005
Mensajes: 2554
Ubicación: Valladolid (España)

MensajePublicado: 23/10/2008 4:09 am Responder citando
Título:

Estudia los operadores bitwise.

En algunas pruebas solían preguntar como hacerlo con estos operadores, personalmente y de forma muy genérica desarrolle este método que gustaba a los examinadores.

Código:
#include <stdio.h>
#include <limits.h>

#define pbit(v, ds)  !!((v) & 1 << (ds))

void foo(int v)
{
int i = sizeof i * CHAR_BIT;

    while(i--)
        putchar ( pbit(v, i) + '0' );
}


S2.
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
elpre



Registrado: 30 Sep 2008
Mensajes: 38

MensajePublicado: 26/10/2008 6:40 am Responder citando
Título:

mmm, voy a probarlo, supongo que esta funcion la tendré que poner junto con el programa de arriba, pero porque entonces has puesto los #include???
Y bueno, auqnue lo voy a probar, sinto decirte que no lo entiendo muy bien.
Gracias, y saludos
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
rir3760



Registrado: 01 Oct 2004
Mensajes: 7472
Ubicación: Mexico

MensajePublicado: 26/10/2008 7:26 am Responder citando
Título:

Una breve descripcion.

El lenguaje C provee tres operadores a nivel de bits, estos son AND ('&'), OR ('|') y XOR u "or exclusivo" ('^'). Estos tres operadores son binarios lo que significa que requieren de dos operandos, uno a ambos lados de tipo int o long int (si alguno de los operandos es de un tipo "menor" como char o short estos se convierten automaticamente al tipo signed int o unsigned int dependiendo del rango de los tipos).

Ambos operandos son procesados y el resultado es un entero donde cada bit depende del operador y el bit de los operandos. El bit resultante es:

1) En el caso del operador '&' el bit es igual a uno si el bit en ambos operandos es igual a uno, caso contrario es cero.

Por ejemplo 5 & 17:
Código:
00101 == 5
10001 == 17
-----
00001 ==> 5 & 17 == 1


2) En el caso del operador '|' el bit es igual a uno si el bit de uno de los operandos (incluso ambos) es igual a uno, el resultado es cero solo si el bit de ambos operandos es igual a cero.

Por ejemplo 5 | 17:
Código:
00101 == 5
10001 == 17
-----
10101 ==> 5 | 17 == 21


3) En el caso del operador '^' el bit es igual a uno si el bit de los operandos es distinto, el resultado es cero solo si los bits de los operandos son iguales.

Por ejemplo 5 ^ 17:
Código:
00101 == 5
10001 == 17
-----
10100 ==> 5 ^ 17 == 20


En cuanto al programa de Cheroky para probarlo solo tienes que definir la funcion "main" justo despues de la funcion "foo".

Ya por ultimo lo mejor para entender el tema es consultar algun buen libro como "The C Programming Language" o "Pointers on C".

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
elpre



Registrado: 30 Sep 2008
Mensajes: 38

MensajePublicado: 02/11/2008 8:36 am Responder citando
Título:

ufff, perdona por la tardanza de mi respuesta, e que he estado bastante liado, ya que prové la funcion que me pasaste y vi que iva bien, así que dejé el tema por zanjado, pero hemos tenido que volver al mismo tema de nuevo, ya que en clase no hay nadie mas que haya echo el programa así, por lo que hemos tenido que inventar otra forma. Se nos ha ocurrido hacer esto (Va explicado, no programado):
lo primero hacer un XOR con el uno, mover una posicion a la derecha y multiplicar por 10. Si el numero que quieres convertir no es divisble por 2, entonces al resultado de multimplicar por 10 le sumas 1, y da lo mismo que quieres conseguir.
Bueno, esto lo hemos echo a papel y lapiz con bastantes numeros y daba, bien, pero al prgramarlo, sólo conseguiamos que paareciesen 2 numeros.
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
elpre



Registrado: 30 Sep 2008
Mensajes: 38

MensajePublicado: 03/11/2008 1:04 pm Responder citando
Título:

Bueno, como se que aquí las palabras sirven de poco, pues os pongo lo que hemos echo del programa explicado arriba:
#include<stdio.h>

main()
{
int i;
int x;

printf("Sartu zenbakia:");
scanf("%d",&x);
if(x!=1){
i=x^1;
i=i>>1;
i=10*i;
i=i+(x%2);
}
else
i=1;

printf("%d",i);
getchar();
getchar();
return 0;
}

Y bueno, lo dicho, que sólo aparecen 2 digitos y si pones por ejemplo el 5, sale 21, vamos que no va como tiene que ir, si a alguien se le ocurre, bien venidas sean las respuestas.
Un saludo
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
cheroky



Registrado: 22 Sep 2005
Mensajes: 2554
Ubicación: Valladolid (España)

MensajePublicado: 03/11/2008 9:30 pm Responder citando
Título:

Me temo que os estáis complicando la vida, ya que el uso de lo operadores a nivel de bit hacen prescindible (en este caso) cualquier otro operador aritmético, basta dar un vistazo a las dos versiones (aritmética vs bitwise) publicadas en este hilo.


S2.
_________________
La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí.
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Rikusan



Registrado: 22 Oct 2008
Mensajes: 13

MensajePublicado: 04/11/2008 5:03 pm Responder citando
Título:

HOla mucho gusto, pues aquí tienes la respuesta a tu problema, este programa lo que hace es el promedio de numeros y transformar de decimal a binario:

Código:
#include<conio.h>
#include<stdio.h>

int binario(int *c);
int binario1(int *b);
int binario2(int *a);
int promedio(int *n1);
main()

{
   int x, y, z, promedio;
   clrscr();
   printf("Introduce tres numeros para mostrar su promedio y su valor en binario\n ");
   printf("Introduce tu numero 1\n");
   scanf("%d",&x);
   printf("Introduce tu numero 2\n");
   scanf("%d",&y);
   printf("Introduce tu numero 3\n");
   scanf("%d",&z);

   promedio=(x + y + z)/3;

   printf("\n\nSu decimal es:  %d\tsu binario es:   ",x );
   binario(&x);
   printf("\n\nSu decimal es:  %d\tsu binario es:   ",y );
   binario1(&y);
   printf("\n\nSu decimal es:  %d\tsu binario es:   ",z );
   binario2(&z);

   printf("\n\nEl promedio es: %d",promedio);
   printf("\n\nSu decimal es:  %d \t su binario es:   ",promedio );
   binario2(&promedio);


   getch();
   return 0;
   }


   int binario(int *c)
   {
   int n1;

      for(n1=128;n1>=1;n1/=2)
   {
   if(*c & n1)
   printf("1");
   else
   printf("0");
   }
   return 0;
   }

   int binario1(int *b)
   {
   int n2;
      for(n2=128;n2>=1;n2/=2)
   {
   if(*b & n2)
   printf("1");
   else
   printf("0");
   }
   return 0;
   }

   int binario2(int *a)
   {
   int n3;
      for(n3=128;n3>=1;n3/=2)
   {
   if(*a & n3)
   printf("1");
   else
   printf("0");
   }
   return 0;
   }

   int promedio(int *n1)
   {
   int n5;
      for(n5=128;n5>=1;n5/=2)
   {
   if(*n1 & n5)
   printf("1");
   else
   printf("0");
   }
   return 0;
   }


Tu puedes modificar para que solo haga lo que tu desees n.n
_________________
~RoSenRot~
Volver arriba
Ver perfil del usuario Enviar mensaje privado
rir3760



Registrado: 01 Oct 2004
Mensajes: 7472
Ubicación: Mexico

MensajePublicado: 05/11/2008 7:51 am Responder citando
Título:

Rikusan escribió:
HOla mucho gusto, pues aquí tienes la respuesta a tu problema, este programa lo que hace es el promedio de numeros y transformar de decimal a binario

Si bien tu programa funciona esta limitado a numeros menores que 256. Otra deficiencia es la definicion de cuatro funciones que hacen exactamente lo mismo, por supuesto bastaria con una sola.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
elpre



Registrado: 30 Sep 2008
Mensajes: 38

MensajePublicado: 09/11/2008 9:57 am Responder citando
Título:

rir3760 escribió:
Rikusan escribió:
HOla mucho gusto, pues aquí tienes la respuesta a tu problema, este programa lo que hace es el promedio de numeros y transformar de decimal a binario

Si bien tu programa funciona esta limitado a numeros menores que 256. Otra deficiencia es la definicion de cuatro funciones que hacen exactamente lo mismo, por supuesto bastaria con una sola.

Un saludo


Lo primero muchas gracias por las respuestas que me habeis dado, ya que por lo menos se como funcionan todos los OR, AND, XOR, etc.
En cuanto al programa que me ha pasado rikusan, parece va bien, aunque sólo necesitaba el binario, de todas formas igual gracias, puede que lo necesite otro día, o quizá otra persona.
Después, lo de que está limitado a numeros menores de 256, sólo hay que modificar la funcion y decirle en el for que valla de un numero mas alto:
for(n1=512;n1>=1;n1/=2), con esto lo haría hasta 1023
aunque otra cosa, porque a la función le envias un puntero???, no se si me explico, quiero decir que haces binario(int *c) y para llamarla haces binario (&x), no se si me explico
Volver arriba
Ver perfil del usuario Enviar mensaje privado MSN Messenger
rir3760



Registrado: 01 Oct 2004
Mensajes: 7472
Ubicación: Mexico

MensajePublicado: 09/11/2008 4:04 pm Responder citando
Título:

elpre escribió:
aunque otra cosa, porque a la función le envias un puntero???, no se si me explico, quiero decir que haces binario(int *c) y para llamarla haces binario (&x), no se si me explico

No hay razon de peso para hacerlo ya que dentro de la funcion no se modifica al objeto apuntado.

La funcion se podria simplificar a:
Código:
int binario(int c)
{
   int n1;
   
   for (n1 = 128; n1 >= 1; n1 /= 2)
      if (c & n1)
         printf("1");
      else
         printf("0");
     
   return 0;
}


Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
Ver perfil del usuario Enviar mensaje privado Enviar correo
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 2 Todas las horas están en GMT - 8 Horas
Ir a página 1, 2  Siguiente

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com, 1999-2007

Un proyecto de UrlanHeat.com