/
Inicio :: Foros

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

programa que cuente numero de bits a uno

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



Registrado: 30 Oct 2007
Mensajes: 6

MensajePublicado: 01/11/2007 9:40 am
Título: programa que cuente numero de bits a uno

necesito crear un programa en dev C++ que me diga el numero de bits a uno que tiene un numero binario dado. el problema es que no he programado nunca en c y no se que hago mal cuando me salen errores. He estado intentanto hacer el programa y he llegado a esto, que no se si realmente hara lo que quiero:
#include <stdio.h>
#include <stdlib.h>

int CuentaNumBitsA1 ()
int n,num,nbits,mask,i,suma;
n=sizeof(int)*8;
nbits=0;
mask=00000001;
printf("Introduzca numero en binario: \n");
scanf("%d",&num);
for(i=0:i<n;i++)
{
suma=num&mask;
if (suma==00000001)
{
nbits++
}
}
int main(int argc, char *argv[])
{

system("PAUSE");
return 0;
}

que me da un syntax error antes de "n"
_________________
Si te molesta que te mientan,
no preguntes.
Volver arriba
guimel



Registrado: 17 Oct 2007
Mensajes: 12

MensajePublicado: 01/11/2007 12:40 pm
Título:

El programa tiene algunos errores:

En primer lugar, no has encerrado entre llaves el cuerpo de la función CuentaNumBitsA1. Toda función en C debe tener el cuerpo delimitado por llaves '{}'. Eso explica el sintax error.

En segundo lugar, 0000001 no es la forma de representar un número binario en C, 00000010 es un diez, no un dos representado en binario. De todas formas puede valer, porque da la casualidad de que 1 se escriben igual en binario y decimal.

En tercer lugar, el bucle no actua correctamente. En realidad, siempre compara el mismo bit de 'num', con lo que nbits valdrá 0 o n al terminar el for. Además, tienes que devolver el valor nbits con return.

Y desde la función main, debes llamar a CuentaNumBitsA1, o no se ejecutará.

Otra cosa, hay un : en lugar de un ; en el for, y algo más abajo falta otro ;.


He modificado un poco tu código para eliminar los errores:

Código:


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

void  CuentaNumBitsA1 ()
{
   int n,num,nbits,mask,i,suma;
   n=sizeof(int)*8;
   nbits=0;
   mask=1;
   printf("Introduzca número: \n");
   scanf("%d",&num);

   for(i=0;i<n;i++)
   {
      suma=num&mask;
      mask=mask << 1;
      if (suma != 0)
      {
         nbits++;
      }
   }

   printf("El número %d tiene %d bits a 1", num, nbits);
}
int main(int argc, char *argv[])
{
   CuentaNumBitsA1();
   system("PAUSE");
   return 0;
}


Como ves, he introducido otra operación en el bucle, mask = mask << 1, que lo que hace es desplazar los bits de mask 1 bit a la izquierda. Es decir, cada vez que el bucle itera, mask vale 1, 2, 4, 8... o en binario 00000001, 00000010, 00000100, 00001000,...

Pruébalo y experimenta con él. Ojo! los numeros que acepta deben estar en decimal (base-10), no en binario.
_________________
Las ciencias de la computación están tan poco relacionadas con las computadoras como la astronomía con los telescopios

Edsger Dijkstra
Volver arriba
rir3760



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

MensajePublicado: 01/11/2007 2:51 pm
Título:

Una forma eficiente de contar el numero de bits a uno en un numero entero es reduciendo este mediante la expresion:
Código:
numero = numero & (numero - 1)

Aprovechando el hecho de que esta expresion desactiva (o pone a cero) el bit menos significativo que este a uno (por cierto uno de los ejercicios del libro sagrado de C "K&R2").

Un programa de ejemplo en C estandar utilizando esa expresion es:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define RANGO_VALORES  32

int main(void)
{
   unsigned numero;
   unsigned aux;
   int bits_a_uno;
   
   srand((unsigned) time(NULL));
   
   numero = rand() % RANGO_VALORES;
   
   bits_a_uno = 0;
   for (aux = numero; aux != 0; aux &= (aux - 1))
      bits_a_uno++;
   
   printf("%u ==> bits a uno == %d\n", numero, bits_a_uno);
   
   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
gaty



Registrado: 30 Oct 2007
Mensajes: 6

MensajePublicado: 01/11/2007 3:19 pm
Título:

muchas gracias a los dos, guimelel codigo que has puesto funciona perfectamente, pero yo quiero poder introducir el numero en binario no en decimal
_________________
Si te molesta que te mientan,
no preguntes.
Volver arriba
digies



Registrado: 18 Nov 2005
Mensajes: 240
Ubicación: Cono Sur

MensajePublicado: 01/11/2007 5:26 pm
Título:

Sin ir más lejos, una forma tonta de hacer lo que tú quieres, es no utilizar operadores de bits y desplazamientos:

Código:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 20

int main(void)
{
    char b[MAX];
    int tam, i, nbits=0;
    printf("Binario: ");
    gets(b);
    tam=strlen(b);
    for(i=0; i<tam; i++)
        if(b[i]=='1')
            nbits++;
    printf("El binario %s tiene %d bits a 1\n\n", b, nbits);
    system("PAUSE");
    return EXIT_SUCCESS;
}


Pero el código de guimel es mucho más interesante que este, por el hecho de usar operadores de bits y demás, sin importar que la entrada de datos sea un número de base 10 y no un binario.

Un saludo
Volver arriba
guimel



Registrado: 17 Oct 2007
Mensajes: 12

MensajePublicado: 01/11/2007 11:51 pm
Título:

Otra forma de leer una cadena como un número binario es usar las funciones estándar strtol o strtoul, que retornan un long o un unsigned long, a partir de una cadena con un número y la base en que se representa:

Código:
   
        char strnum[256];
        unsigned long num;


        printf("Introduzca número: \n");
   scanf("%s",strnum);
   num = strtoul(strnum,NULL, 2);



En general, conviene ver si algo que queremos hacer está implementado en la librería estándar, porque nos ahorrará trabajo y errores. Mas de una vez me he quebrado la cabeza para reinventar la rueda, cuando tenía la solución en una llamada a una función de la librería estándar.
_________________
Las ciencias de la computación están tan poco relacionadas con las computadoras como la astronomía con los telescopios

Edsger Dijkstra
Volver arriba
gaty



Registrado: 30 Oct 2007
Mensajes: 6

MensajePublicado: 02/11/2007 3:49 am
Título:

muchas gracias a los dos por vuestra ayuda, podriais explicarme un poco paso a paso el codigo que me habeis puesto, tened en cuenta que hasta este mismo lunes no habia programado en c en mi vida y la mitad de las cosas que hay escritas no sse para que sirven, si me las pudierais explicar os lo agradeceria mucho. tambien me gustaria saber como averiguo si algo esta implementado en la libreria estandar
_________________
Si te molesta que te mientan,
no preguntes.
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