| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
m@o_614
Registrado: 13 Dic 2011 Mensajes: 19
| Publicado: 25/12/2011 3:49 pm | | | Título: operador ~ |
| [code] int binario(int num); int complemento(int num_bin);
int main() { int num,num_bin,complemento_a_dos; printf("Bits en la RAM\n\n"); printf("Dame un valor entero: "); scanf("%d",&num); if(num>0) binario(num); else if(num<0) { num=-num-1; num_bin=binario(num); complemento_a_dos=complemento(num_bin); } printf("\nPresione una tecla para continuar...\n"); getch(); return 0; }
int binario(int num) { if(num>1) { binario(num/2); num%=2; printf("%d",num); return num; } else { printf("%d",num); return num; } }
int complemento(int num_bin) { int complemento_a_dos; complemento_a_dos=(~num_bin); return(complemento_a_dos); }
tengo un problema con este codigo que me tiene que calcular el complemento a dos de un numero negativo, porque cuando le ingreso un numero como -127 me sale 1111110, pero deberia de ser 0000001[/code] |
|
| Volver arriba | |
 |
cheroky
Registrado: 22 Sep 2005 Mensajes: 2479 Ubicación: Valladolid (España)
| Publicado: 26/12/2011 2:39 am | | | Título: |
| Hola.
No, el complemento a 2 de -127 (representación del opuesto en C2 de 127) es 10000001. No esta de más recordar que C2n = 2^k - n. Hay varias incongruencias en el programa como son el orden de llamada de las funciones. La función complemento no es correcta, el C2 debe hacerse sumando 1 después de haber negado todos los bits. Variables mal utilizadas... y algún nombre demasiado largo.
Las correcciones intentando respetar al máximo tu estilo, que es navidad (es C a palo seco)
| Código: | #include <stdio.h>
void prn_bin(unsigned char num); int comp2(int num_bin);
int main(void) { int num, c2;
printf("Dame un valor entero: "); fflush(stdout); scanf(" %d", &num);
c2 = comp2(num); prn_bin(c2); /* ¿Hacer algo con c2? */
return 0; }
void prn_bin(unsigned char num) /* 8 bits */ { if(num > 1) prn_bin(num / 2); putchar((num %= 2) + '0'); }
int comp2(int num_bin) { return ~(-num_bin) + 1; } |
·?0ƒ· _________________ La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí. |
|
| Volver arriba | |
 |
m@o_614
Registrado: 13 Dic 2011 Mensajes: 19
| Publicado: 27/12/2011 9:59 am | | | Título: |
| | muchas gracias! no pense que el codigo pudiera tener tantos errores, crei que el compilador no esta leyendo el ~ |
|
| Volver arriba | |
 |
|
m@o_614
Registrado: 13 Dic 2011 Mensajes: 19
| Publicado: 27/12/2011 4:28 pm | | | Título: |
| | oye una duda mas si quiero que el numero sea de 32 bits en vez de 8 como lo haria??? |
|
| Volver arriba | |
 |
cheroky
Registrado: 22 Sep 2005 Mensajes: 2479 Ubicación: Valladolid (España)
| Publicado: 27/12/2011 8:19 pm | | | Título: |
| Hola.
Lo mejor es que permita hacerlo con un rango arbitrario de bits. Se puede cambiando la función recursiva por una solución iterativa y añadiendo un segundo parámetro, el rango.
| Código: | #include <stdio.h>
void prn_bin(int num, unsigned nbits); int comp2(int num_bin);
int main(void) { int num, c2;
printf("Dame un valor entero : "); fflush(stdout); scanf(" %d", &num);
c2 = comp2(num); prn_bin(c2, 13); /* Ejemplo para 13 bits */
return 0; }
void prn_bin(int num, unsigned nbits) { while(nbits--) putchar( !!(num & 1 << nbits) + '0' ); }
int comp2(int num_bin) { return ~(-num_bin) + 1; } |
Otro detalle que se puede incluir es manejar el overflow, sabiendo que un numero de base 10 en complemento a 2 requiere la parte entera de [log2(n) + 2] bits . Esto es así por que se añade el bit o los (dependiendo del rango) bits más significativos, indicando ello el valor negativo.
·?0ƒ· _________________ La cuestión no es si hay vida inteligente en otros planetas lejanos. La cuestión es si hay vida inteligente aquí. |
|
| Volver arriba | |
 |
|
|