/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

ayuda para acabar un programa que no tengo idea de com se ha

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
hipno_12



Registrado: 10 Oct 2007
Mensajes: 5

MensajePublicado: 22/10/2007 2:24 pm
Título: ayuda para acabar un programa que no tengo idea de com se ha

es un programa en dev c++ el cual convierta un numero a binario pero la verdad no se ni como esto es lo unico que llevo#include <stdio.h>
#include <conio.h>

main()
{
int b,a,c,s,d,e;
printf("un numero binario\n");
do
{
printf("dame el valor a comvertir");
scanf("%d",&a);
do
{
b=a/2;
c=a%2;
d=b%2;
e=b;
printf("%d,%d",c,d);
}
while(e<0);
printf("quiere realizar otro numero\n1)si\n2)no\n:");
scanf("%d",&s);
}
while(s==1);
getch();
}
Volver arriba
Dirección AIM
daltomi



Registrado: 28 Abr 2007
Mensajes: 114
Ubicación: Argentina

MensajePublicado: 22/10/2007 3:27 pm
Título:

Para mostrar por pantalla un número en su correspondiente valor binario, se puede utilizar el desplazamiento de bit's.

Observa éste ejemplo:
Código:

void VisualizaBits(unsigned Numero)
{
  unsigned i;
  unsigned Mascara = 128;

  for(i=1; i<=8; i++){
   if(Numero & Mascara)
   {
   cout.put('1');
   }else{
      cout.put('0');
   }
   Numero<<= 1;
   cout.put(' ');
  }
  cout<<endl;
}

Lo encontré en la Red, asi que voy a tratar de explicarlo:

Como necesitamos comparar sólo un bit por vez en cada operación AND(&), nesecitamos un número que contenga un bit en 1 y los demás en 0, teniendo en cuenta que un BYTE es igual a 8 bit:
Código:

10000000b == 128d

Es decir desplazamos el valor 00000001b unos 7 lugares a la izquierda, que es lo mismo:
Código:

unsigned Mascara = 1 << 7;

Ahora directamente a la función:
daltomi escribió:


Teniendo en cuenta que:

Mascara -> 128d == 10000000b (constante)
Numero -> 9d == 00001001b (como ejemplo)
----------------------------

Comparación AND alineado con desplazamiento a la izquierda de Numero.

Itera 1:
10000000b Mascara
00001001b Numero
---------
00000000b -> 0d

Itera 2:
10000000b Mascara
00010010b Numero = Numero << 1
---------
00000000b -> 0d

Itera 3:
10000000b Mascara
00100100b Numero = Numero << 1
---------
00000000b -> 0d

Itera 4:
10000000b Mascara
01001000b Numero = Numero << 1
---------
00000000b -> 0d

Itera 5:
10000000b Mascara
10010000b Numero = Numero << 1
---------
10000000b -> 128d

Itera 6:
10000000b Mascara
00100000b Numero = Numero << 1
---------
00000000b -> 0d

Itera 7:
10000000b Mascara
01000000b Numero = Numero << 1
---------
00000000b -> 0d

Itera 8:
10000000b Mascara
10000000b Numero = Numero << 1
---------
10000000b -> 128d

Dado los resultados en cada iteración, podemos "concatenar" dichos resultados:
1: 0 y 2: 0 y 3: 0 y 4: 0 y 5: 1 y 6: 0 y 7: 0 y 8: 1

Resultado en pantalla: "00001001"


Saludos.
Volver arriba
rir3760



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

MensajePublicado: 22/10/2007 3:55 pm
Título:

Para "convertir" un numero de decimal a binario tienes que dividirlo repetidamente entre dos. En cada iteracion el residuo de la division te dara el bit menos significativo.

Esta operacion se puede realizar de varias formas por ejemplo utilizando el operador de residuo (el '%') en la division entre enteros o utilizando el operadores a nivel de bits.

Un ejemplo relativamente sencillo de esto utilizando el operador de residuo y aritmetica de punteros (para no tener que invertir el resultado) es (C estandar):
Código:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

#define NUM_BITS  ((int) sizeof(int) * CHAR_BIT)

int main(void)
{
   char binario[NUM_BITS + 1]; /* +1 para el '\0' */
   char *p;
   unsigned numero;
   int aux;
   
   printf("Introduce un numero positivo: ");
   fflush(stdout);
   if (scanf("%u", &numero) != 1)
      return EXIT_FAILURE;
   
   p = binario + NUM_BITS;
   aux = numero;
   do {
      *--p = '0' + (aux % 2);
   }while ((aux /= 2) > 0);
   binario[NUM_BITS] = '\0';
   
   printf("%u == %s\n", numero, p);
   
   return EXIT_SUCCESS;
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
spesmod



Registrado: 23 Ago 2007
Mensajes: 33

MensajePublicado: 23/10/2007 9:35 am
Título:

esta es otra posible opcion,,,

Código:

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include <stdlib.h>


void vcb(int a, int m[]);
int bindec(int m[]);


main()
{
int j, c_bin[8];

clrscr();
printf("ESCRIBE UN NUMERO\n");
scanf("%i", &j);
vcb(j,c_bin);   ////>>>IMPRIME EL CODIGO BINARIO
printf("\n%i",bindec(c_bin));   ////>>>TOMA EL CODIGO BINARIO
                                ////>>>Y LO VUELVE DECIMAL
                                ////>>>(a manera de comprobacion).
getch();

return 0;
}

void vcb(int a, int m[])
{
for(int i=7; i>=0; i--)
   {
   m[i]=a%2;
   a=a/2;
   }
for(i=0;i<=7;i++)
   printf("%i",m[i]);
}

int bindec(int m[])
{
int k, l=0;
for(k=7;k>=0;k--)
   l=(m[7-k]*pow(2,k))+l;
return l;
}


pero aqui he puesto dos funciones:

Código:
void vcb(int a, int m[]);


permite VerCodigoBinario de un numero; por eso se llama vcb, y almacena cada valor en un array de 8 elementos, al finalizar la fucion, al cada elemento contiene a un 1 o 0 dependiendo del numero ingresado.

la otra funcion:

Código:
int bindec(int m[]);


hace lo opuesto... recibe una matriz de 8 elementos obviamente estos son unos o ceros, y los convierte en un valor entero, y devuelve dicho valor, puede ser que esa funcion tambien te sirva, asi que bueno ps espero ayudaros.
_________________
|--A--Q--U--A--|
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 23/10/2007 1:54 pm
Título:

También puedes usar una macro que te permite visualizar un determinado bit en una determinada posición, aplicando esta macro sobre un bucle permite visualizar todo el rango.

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

#define PUTBIT(var, pos) !!((var) & 1 << (pos))


int main()
{
   
int i = sizeof(i) * CHAR_BIT;   
int v = 0x29A;   
   
   
    while(i--)
    {
        putchar( PUTBIT(v ,i) + '0' );
        if( i % CHAR_BIT == 0 ) putchar(' ');
    }

return 0;   
}

Y otra forma muy eficiente con doble desplazamiento, siempre y cuando se use el tamaño de palabra del procesador o se trunque a ese tamaño.
Código:
#include <stdio.h>
#include <limits.h>
#define PUTBIT(var ,pos ) ((var) <<(pos)>> (sizeof(var) * CHAR_BIT)-1)

int main()
{

unsigned  var = 0x29A;
int pos = 0;
           
        while( pos <  sizeof(var) * CHAR_BIT )
        {
                printf("%d", PUTBIT(var, pos));   
                pos++;
                if( pos % CHAR_BIT == 0 ) putchar(' ');
        }
 
 return 0;   
}


S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
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

Un proyecto de UrlanHeat.com