|
| Autor |
Mensaje |
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Jue 15 Dic, 2011 22:07 pm
Título del mensaje: complemento a dos |
|
|
tengo unas dudas de que algoritmo utilizar para sacar el complemento a dos de un numero negativo, estaba pensando que alomejor con divisiones sucesivas hasta que el residuo me de 1 y apartir de ese uno cambiar los ceros por unos y viceversa del numero, pero no estoy segura
No quiero que me hagan el codigo solamente que me ayuden a pensar que algoritmo me conviene utilizar |
|
|
|
| Volver arriba |
|
|
JoxeDuKe12 Moderador

Registrado: 12 Abr 2007 Mensajes: 452 Ubicación: Medellín - Colombia
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Vie 16 Dic, 2011 18:43 pm
Título del mensaje: Re: complemento a dos |
|
|
el complemento a dos es cuando al numero binario buscas de derecha a izquierda el primer 1 del numero y a partir de ahi vas intercambiando los digitos, unos por ceros y ceros por unos
asi como:
1001100= 0110000 o tambien primero cambias todos los digitos del numero binario y despues le sumas uno, pero ese creo que es mas dificil de implementar |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Sab 17 Dic, 2011 00:19 am
Título del mensaje: Re: complemento a dos |
|
|
marcela pero para darle aplicación en C? si es así puedes hacer complemento a dos sencillamente usando los operadores de bits que dispone el C, para desplazarte entre bits, operaciones lógicas, etc...
Si, también tengo entendido que debe aplicarse primero un complemento uno, que es solamente invertir el contenido binario de un valor, para ello puedes hacerle una sencilla operación NOT, representado con el signo ~ .
Ejemplo:
| Código: | char byte=8;
cout << (~byte); // invertimos el contenido binario del valor, con lo que se queda en -9 (valor con signo)
...
|
y una vez aplicado el complemento uno, aplicamos la suma del acarreo. Entonces quedaría así:
| Código: | cout << (~byte)+1; // complemento a dos, ahora tenemos -8
...
|
Como puedes apreciar nos puede servir para cambiar de signo a un número. |
http://www.youtube.com/watch?v=-lT1zCukNQY
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Vie 23 Dic, 2011 19:45 pm
Título del mensaje: Re: complemento a dos |
|
|
| Código: |
int binario(int num);
int invertir(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;
}
return 0;
}
int complemento(int num_bin)
{
int complemento_a_dos;
complemento_a_dos=~num_bin;
return (complemento_a_dos);
}
en la penultima linea de codigo trate de usar el operador ~ para invertir los numeros pero no compila correctamente |
|
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Vie 23 Dic, 2011 23:49 pm
Título del mensaje: Re: complemento a dos |
|
|
...que raro que no lo soporte el compilador que tienes... bueno, bien pensao creo que soporta el operador lógico NOT solamente para uso condicional, cierre de exclamación.
| Código: | ...
if (!true) // si no es verdad entonces ....
...
|
.. pero el operador de bits, yo creo que si... que alguien me saque de dudas eduard801289138938 !!!!
...de todas formas puedes suplirlo así de sencillo
| Código: | int complemento(int num)
{
return ++num*(-1);
} |
Total, para lo que se consigue, es para cambiarle de signo... para algo valieron las clases de matemáticas de primaria, más por menos, menos, menos por menos, más... todavía resuena en mi cabeza esa maldita cancioncilla
Oye y ese código para qué es? |
http://www.youtube.com/watch?v=-lT1zCukNQY
Ultima edición por WhiteSkull el Mar 27 Dic, 2011 21:08 pm; editado 1 vez
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Sab 24 Dic, 2011 04:43 am
Título del mensaje: Re: complemento a dos |
|
|
Es para convertir de decimal a binario, incluyendo los numeros negativos(con complemento a dos) pero cuando le ingreso por ejemplo -127 me sale
1111110, cuando deberia de ser 0000001 |
|
|
|
| Volver arriba |
|
|
eduar2083 Usuario Activo

Registrado: 14 Nov 2008 Mensajes: 195 Ubicación: Lima - Perú
|
Publicado: Sab 24 Dic, 2011 08:08 am
Título del mensaje: Re: complemento a dos |
|
|
Hola.
- Es preferible postear el programa completo, incluído los headers.
- En la medida de lo posible, trata de escribir código estándar (Ansi C), si el programa no lo requiere (como en tu caso), no hay necesidad de utilizar el header conio.h de los arcaicos compiladores Borland.
El operador a nivel de bits complemento a uno ~, cambia el estado de cada bit en la variable afectada. O sea, los 1 se ponen a 0 y los 0 a 1.
n = -n - 1
equivale a hacer complemento a 1:
n = ~n
~(-127) -------> 126
que convertido a binario sería: 1111110
Por tanto la salida es correcta.
| Código: | #include <stdio.h>
int binario(int num)
{
int digito = num % 2;
int resto = num / 2;
return resto > 0 ? binario(resto) * 10 + digito : digito;
}
int main(void)
{
int num, b;
printf("Deme numero decimal: ");
scanf("%d", &num);
if (num >= 0) {
b = binario(num);
printf("--> %d\n", b);
}
else {
num = ~num;
/* num = ~num + 1; Complemento a 2 */
b = binario(num);
printf("--> %d\n", b);
}
return 0;
}
|
Un saludo. |
|
|
|
| Volver arriba |
|
|
WhiteSkull Moderador Global

Registrado: 20 Mar 2009 Mensajes: 2084 Ubicación: y*width+x
|
Publicado: Lun 26 Dic, 2011 17:21 pm
Título del mensaje: Re: complemento a dos |
|
|
| marcela escribió: | ...pero cuando le ingreso por ejemplo -127 me sale
1111110, cuando deberia de ser 0000001
|
vale... pero el resultado correcto, representado en complemento dos, es 10000001 que corresponde al valor decimal de 129. Pero según observo en el código, tu idea es que cuando recibe un valor negativo, le realizas un complemento a dos para pasarlo a positivo, 127, en binario 011111111, pero en verdad no estás interpretando correctamente los números negativos en complemento dos, entiendes? Por lo que la forma correcta, es representar el número tal cual, usando otro método que convierta a binario. Como cité al principio del hilo, utilizar los operadores bitwise te podría valer, ya que es una forma de trabajar directamente a nivel de bits, pero para ello hay que estudiarlos y entender su funcionamiento.
Mira te propongo esta alternativa a tu función binario() y a la que muestra generosamente nuestro compañero eduar:
| Código: | #include <stdio.h>
#include <conio.h>
void binario(char num);
//void invertir(int num);
int complemento(int num_bin);
int main()
{
char num; // recuerda que un entero, normalmente son 32 bits y un char son 8
printf("Trabajando con Bits\n\n");
printf("Dame un valor de 8 bits con signo (-127 a 127): ");
scanf("%d",&num);
printf("\nNumero binario de %d = ",num);
binario(num);
// if(num>0)
// binario(num);
// else if(num<=0)
// {
// num=-num-1;
// num_bin=binario(num);
// complemento_a_dos=complemento(num_bin);
// }
printf("\n\n\nPresione una tecla para continuar...\n");
getch();
return 0;
}
void binario(char num)
{
for (unsigned char posBit=8;posBit>0;posBit--)
printf("%d", (1/*El uno hace de mascara para comprobar el bit más a la izquierda, */
& (num >> (posBit-1) /* que es desplazado en cada pase */)));
/* Esta misma operacion también puede ser realizada al reves(hacia la derecha), pero con 128 */
// if(num!=0)
// {
// binario(num/2);
// num%=2;
// printf("%d",num);
// return num;
// }
//return 0;
}
int complemento(int num)
{
return ++num*(-1);
} |
Ah!, otra cosa, si queremos trabajar con registros de 8 bits para no llenar la pantalla de ceros, lo aconsejable sería trabajar con un char, que normalmente equivale a un byte, pero hay que tener en cuenta que los rangos de trabajo ,para números con signos, son de -127 a 127, por eso hice esa pequeña modificación en tu código.
Ah! me olvidaba, esa será la representación del compilador, la forma que tiene de trabajar con los datos, esa interpretación puede variar con otros compiladores, esto es un problema que no solamente pasa con números decimales, si no también con flotantes o reales.
Ah! más cosas. Si quieres que el resultado sea representación a complemento a dos, indiferentemente de como lo interprete el compilador. Puedes coger el número negativo y le sumas 256, pero recuerda trabajar con registros de 8 bits. El resultado se ajustará a una representación a complemento dos. Por ejemplo, si a -127 le sumamos 256, obtenemos 129.
Esto es todo, suerte
Referencias:
http://es.wikipedia.org/wiki/Representaci%C3%B3n_de_n%C3%BAmeros_con_signo
http://en.wikipedia.org/wiki/Bit_manipulation
http://www.blah-blah.ch/it/programming/cpp-read-bits/ |
http://www.youtube.com/watch?v=-lT1zCukNQY
|
|
| Volver arriba |
|
|
marcela Usuario Inquieto
Registrado: 13 Dic 2011 Mensajes: 55
|
Publicado: Mar 27 Dic, 2011 19:48 pm
Título del mensaje: Re: complemento a dos |
|
|
muchas gracias, creo que no entendia bien de que se trataba el complemento a dos |
|
|
|
| Volver arriba |
|
|