elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Restas manuales en "Binario"
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Restas manuales en "Binario"  (Leído 1,942 veces)
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Restas manuales en "Binario"
« en: 1 Mayo 2016, 15:16 pm »

Muy buen dia compañeros.

Ayer publique el tema Números de longitud variable en C (Numeros muy grandes)

Donde transformo strings de numeros a su representación en "binario"  en memoria. Ya hago sumas y multiplicaciones en forma de sumas multiples.
Necesito hacer ahora restas tengo mis dudas se que es una tonteria pero estoy hecho un lio.

Las sumas a nivel de "byte" las hago asi:

Código
  1. unsigned char resultado[3];
  2. unsigned char acarreo;
  3. unsigned char a;
  4. unsigned char b;
  5. unsigned short c;
  6. a = 0xFF;
  7. b = 0x01;
  8. c = a + b;
  9. //ahora c vale 0x0101
  10. resultado[0] = c;
  11. acarreo = c >> 8;
  12. //el acarreo se le suma al siguiente ciclo de bytes

Asi puedo meter ese seudo codigo en un ciclo de N bytes y poder trabajar con numetro positivos de cualquier longitud

Ahora el detalle que necesito usar la operacion modulo y para ello necesito hacer diviciones y por lo tante necesito restas.

Mi duda es hacer las restas mas o menos igual

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. unsigned char a;
  5. unsigned char b;
  6. unsigned short c;
  7. a = 0xFF;
  8. b = 0x01;
  9. c = a - b;
  10. }


Obvio tendré que tener forma de capturar los números negativos, y si es negativo ¿Que hay que hacer? ¿es como si fuera el acarreo en la suma?

intente hacer las restas en el cuaderno en binario y me dormi en el intento eso fue hace unas 5 horas.


« Última modificación: 1 Mayo 2016, 23:16 pm por AlbertoBSD » En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Restas manuales en "Binario"
« Respuesta #1 en: 1 Mayo 2016, 15:18 pm »

Citar
Ya hago sumas y multiplicaciones en forma de sumas multiples

Las potencias las puedes sacar exactamente igual :)


En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Restas manuales en "Binario"
« Respuesta #2 en: 1 Mayo 2016, 15:44 pm »

Gracias boctulus y de hecho asi lo hice con las potencias:

Numero 65535

6 x10^4 : numeros[0]->valor: 0x451410 60ea
5 x10^3 : numeros[1]->valor: 0x451510 8813
5 x10^2 : numeros[2]->valor: 0x4514a0 f401
3 x10^1 : numeros[3]->valor: 0x451530 1e
5 x10^0 : numeros[4]->valor: 0x4513e0 05

Separe cada numero de la cadena y lo convertí a su numero en potencia de 10 y posteriormente sume los números individuales.

Mi problema ahora son las restas. como dice el titulo del post.

En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Restas manuales en "Binario"
« Respuesta #3 en: 1 Mayo 2016, 15:49 pm »

Ya lo tienes hecho. Las restas son sumas de complementos. Crea una función que haga el complemento a 2 de un número dado y éste será el sustraendo. La operación resultante seguirá siendo una suma.
Si el resultado de esta suma tiene acarreo, éste resultado es positivo. Si no tiene acarreo el resultado es negativo.
« Última modificación: 1 Mayo 2016, 15:51 pm por MAFUS » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.705


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Restas manuales en "Binario"
« Respuesta #4 en: 1 Mayo 2016, 16:01 pm »

Gracias MAFUS por tu respuesta, leeré los temas que comentas para aplicar las restas.

Saludos!



Muy buen dia otra vez.

Tengo ahora una intriga sobre el compilador... pero veamos

La definición de complemento a 2 esta dada por 2^n - N donde n es el  numero de bits del numero dado N al que se le quiere sacar complemento, solución Método alterno sacar complemento 1 y sumarle 1 que es mas facil ~N +1

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. unsigned char a,c;
  5. unsigned short b;
  6.  
  7. a = 0xF0;
  8. printf("Nunmero orignal 0x%.2x\n",a);
  9. a = ~a;
  10. printf("Complemento uno 0x%.2x\n",a);
  11. b = a + 1;
  12. c = b >> 8;
  13. printf("Complemento dos 0x%.2x\n",b);
  14. printf("? Acarreo : 0x%.2x\n",c);
  15. a = 0xFF;
  16. printf("Nunmero orignal 0x%.2x\n",a);
  17. a = ~a;
  18. printf("Complemento uno 0x%.2x\n",a);
  19. b = a + 1;
  20. c = b >> 8;
  21. printf("Complemento dos 0x%.2x\n",b);
  22. printf("? Acarreo : 0x%.2x\n",c);
  23. a = 0x00;
  24. printf("Nunmero orignal 0x%.2x\n",a);
  25. a = ~a;
  26. printf("Complemento uno 0x%.2x\n",a);
  27. b = a + 1;
  28. c = b >> 8;
  29. printf("Complemento dos 0x%.2x\n",b);
  30. printf("? Acarreo : 0x%.2x\n",c);
  31. }

El codigo anterior me da la salida:

Código:
Nunmero orignal 0xf0
Complemento uno 0x0f
Complemento dos 0x10
? Acarreo : 0x00
Nunmero orignal 0xff
Complemento uno 0x00
Complemento dos 0x01
? Acarreo : 0x00
Nunmero orignal 0x00
Complemento uno 0xff
Complemento dos 0x100
? Acarreo : 0x01

Lo que me intriga es:

Complemento dos 0x100

Que viene de la linea :

printf("Complemento dos 0x%.2x\n",b);

b es un short pero el formato de cadena es %.2x por lo cual solo me debería de mostrar los primeros 2 hexadecimales correspondientes al primer byte del numero short, en fin... no es problema realmente puedo usar posiciones de memoria para extraer solo el numero que me interesa, solo que me intrigo que no respeto el formato de la cadena...

ahora solo me queda hacer la... resta que quiero usando sumas xD jajajajaja con complemento a 2 en el sustraendo, todavía no la hago pero tengo que ver bien como es el proceso a nivel de bit, lo voy a hacer ahora si en el cuaderno para darme una idea real de que pasa....

Saludos!
« Última modificación: 2 Mayo 2016, 15:57 pm por Eternal Idol » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
"Ayuda" con Codigo(Pasar de Decimal a Binario)
.NET (C#, VB.NET, ASP)
Jirp96 4 5,985 Último mensaje 8 Mayo 2011, 22:20 pm
por Jirp96
recursos visual basic, """"""proceso inmortal"""""
Análisis y Diseño de Malware
Dark4ngel 7 14,173 Último mensaje 3 Noviembre 2011, 10:42 am
por Dark4ngel
China prohíbe pseudónimos "controvertidos" como "Obama" o "Putin" en internet
Noticias
wolfbcn 0 7,663 Último mensaje 5 Febrero 2015, 14:58 pm
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines