Fecha y hora actual: Sab 19 May, 2012 20:46 pm
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

complemento a dos

Responder al Tema

Índice del Foro > C, C#, Visual C++ > complemento a dos

Autor Mensaje
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Jue 15 Dic, 2011 22:07 pm

Título del mensaje: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
JoxeDuKe12
Moderador


Registrado: 12 Abr 2007
Mensajes: 452
Ubicación: Medellín - Colombia

Mensaje Publicado: Vie 16 Dic, 2011 09:05 am

Título del mensaje: Re: complemento a dos

Responder citando

Gorro hola

Busque "complemento a dos" pero no entendí muy bien a que se refiere de pronto podrías dar una explicación de que se trata.

para pasar un decimal a binario te podes guiar con el siguiente ejemplo no es c++ pero te puede servir

http://www.foro.lospillaos.es/macro-para-convertir-numeros-dedimales-a-binarios-dir-ip-vt4752.html

saludos

Gorro


La mejor en musica online y juegos Flash
http://quedese.100webspace.net/
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Vie 16 Dic, 2011 18:43 pm

Título del mensaje: Re: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Sab 17 Dic, 2011 00:19 am

Título del mensaje: Re: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Vie 23 Dic, 2011 19:45 pm

Título del mensaje: Re: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Vie 23 Dic, 2011 23:49 pm

Título del mensaje: Re: complemento a dos

Responder citando

...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 Risa

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 Guitarra Guitarra Guitarra

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
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Sab 24 Dic, 2011 04:43 am

Título del mensaje: Re: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
eduar2083
Usuario Activo


Registrado: 14 Nov 2008
Mensajes: 195
Ubicación: Lima - Perú

Mensaje Publicado: Sab 24 Dic, 2011 08:08 am

Título del mensaje: Re: complemento a dos

Responder citando

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
Ver perfil del usuario Enviar mensaje privado
WhiteSkull
Moderador Global


Registrado: 20 Mar 2009
Mensajes: 2084
Ubicación: y*width+x

Mensaje Publicado: Lun 26 Dic, 2011 17:21 pm

Título del mensaje: Re: complemento a dos

Responder citando

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 Ok
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
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
marcela
Usuario Inquieto


Registrado: 13 Dic 2011
Mensajes: 55

Mensaje Publicado: Mar 27 Dic, 2011 19:48 pm

Título del mensaje: Re: complemento a dos

Responder citando

muchas gracias, creo que no entendia bien de que se trataba el complemento a dos

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Algoritmo de Complemento Uno y Dos en C

SUPER OMAR C, C#, Visual C++ 3 Mie 02 Jun, 2010 20:35 pm Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,