/
Inicio :: Foros

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

operador ~

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
m@o_614



Registrado: 13 Dic 2011
Mensajes: 19

MensajePublicado: 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)

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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)

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> C/C++ en General
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