| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
gaty
Registrado: 30 Oct 2007 Mensajes: 6
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |