Ir al contenido


Foto

de binario a gray y viscebersa


  • Por favor identifícate para responder
5 respuestas en este tema

#1 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 10 septiembre 2010 - 07:51

Hola amigos del foro estoy intentando pasar de binario a codigo Gray y bisceversa, pero aun no se com usar el XoR correctamente, aqui les dejo una explicacion del tema.


Ok la conversión al codigo binario de un codigo gray es muy sencilla, es simplemente saber aplicar la XOR.

XOR, ya sabes.

A  B  XOR
0  0  0
0  1  1
1  0  1
1  1  0

(que es lo mismo que; si son iguales es 0 y si son diferentes es 1).

Ahora la conversión.

si tenemos un numero binario (13)

1100

Para convertirlo a gray es el siguiente algoritmo.

de izquierda a derecha empezando por el bit menos significativo (LMS)
osease que las operaciones siguen el orden de la flecha.

1  1  0  0
--------->

el primer dígito siempre se respeta
y despues del primero se va realizando las operaciones XOR.

Como se muestra en este ejemplo

1    1    0    0
\  / \  / \  /
  I      I    I
1 0      1    0

Hay que rescatar que el primer digito siempre se respeta.Despues de que se tiene el primer digito se van comparando así como se los quiero mostrar en la figura :
El gray seria: 1010

muchas gracias y espero que me puedan ayudar.
  • 0

#2 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 10 septiembre 2010 - 08:42

.....

de izquierda a derecha empezando por el bit menos significativo (LMS)
osease que las operaciones siguen el orden de la flecha.

1  1  0  0
--------->
....


Amigo ifrit, sólo una aclaración... el Bit Menos Significativo será siempre el de tu extrema derecha (por ser el que vale 2 con exponente 0) no el de la extrema izquierda....

Sobre el algoritmo que necesitas, necesitaré hacer algunas pruebas para hacerlo funcionar... paciencia (y)

Saludox ! :)
  • 0

#3 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 10 septiembre 2010 - 10:11

Gracias Fenareth...
Ya estuve trabajando un poco y aquí les dejo las respuestas en funciones, aclaro que no se trabajar con XoR, los resultados están correctos , pero si hay forma de agilizar las funciones u otra sugerencia bienvenida sea.

//convertir de Gray a binario


cpp
  1. String grayToBin(String gray){
  2.  
  3.     String binario;
  4.  
  5.     //respetando el mas izquierdo
  6.     binario = gray[1];
  7.  
  8.     //se aplica XoR a gray adyacente y binario generado
  9.     for (int g = 2; g <= gray.Length(); g++){
  10.  
  11.         int a = gray[g];
  12.         int b = binario[g-1];
  13.         int c = a^b;
  14.         binario += IntToStr(c);
  15.         //binario = IntToStr(StrToInt(gray[g])^StrToInt(binario[g-1]));
  16.     }
  17.  
  18.     return binario;
  19. }




//convertir de binario a Gray



cpp
  1. String binToGray (String binario){
  2.  
  3.     String gray;
  4.  
  5.     //se respeta el mas izquierdo
  6.     gray = binario[1];
  7.  
  8.     //XoR a los elementos
  9.     for (int i = 1; i <= binario.Length(); i++)
  10.         if (i < binario.Length()){
  11.  
  12.             int a = binario[i];
  13.             int b = binario[i + 1];
  14.             int c = a^b;
  15.             gray += String(c);
  16.             //gray += IntToStr(StrToInt(binario[i])^StrToInt(binario[i+1]));
  17.         }
  18.  
  19.     return gray;
  20.  
  21. }



Espero les sirva...como a mi
  • 0

#4 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 septiembre 2010 - 10:16

Te muestro una forma de realizarlo en binario:



cpp
  1. DWORD BinToGray(DWORD N)
  2. {
  3.   return N ^ (N>>1);
  4. }
  5.  
  6. DWORD GrayToBin(DWORD N)
  7. {
  8.   DWORD D = N;
  9.   DWORD X;
  10.   int i;
  11.   for(i=0; D>1;i++) D>>=1;
  12.   D<<=i;
  13.   X = D;
  14.  
  15.   while(X>1){
  16.     N = N^((N&X)>>1);
  17.     X>>=1;
  18.   }
  19.   return N;
  20. }



Saludos.
  • 0

#5 ifrit

ifrit

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 105 mensajes
  • LocationLa Habana, Cuba

Escrito 10 septiembre 2010 - 10:28

Hola scafandra,
la salida DWORD donde como podría utilizarla?
las funciones que utilizo están mal?
Quisiera saber para poder utilizar una u otra, porque aun no se si me es mas factible un a salida en String o DWORD, gracias.
Saludos
  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 10 septiembre 2010 - 01:05

El ejemplo lo he hecho con DWORD o int. Si te interesa el cifrado en números de ese tamaño, entonces es mejor como te he puesto. Si la cadena de bits es de longitud indeterminada, es mejor tratarlo con String, aunque es muy lento.

Con la arítmética binaria te las puedes ingeniar para que el proceso sea mas veloz.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.