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.

de binario a gray y viscebersa
Started by
ifrit
, Sep 10 2010 07:51 AM
5 replies to this topic
#1
Posted 10 September 2010 - 07:51 AM
#2
Posted 10 September 2010 - 08:42 AM
.....
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

Saludox !

#3
Posted 10 September 2010 - 10:11 AM
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
//convertir de binario a Gray
Espero les sirva...como a mi
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
String grayToBin(String gray){ String binario; //respetando el mas izquierdo binario = gray[1]; //se aplica XoR a gray adyacente y binario generado for (int g = 2; g <= gray.Length(); g++){ int a = gray[g]; int b = binario[g-1]; int c = a^b; binario += IntToStr(c); //binario = IntToStr(StrToInt(gray[g])^StrToInt(binario[g-1])); } return binario; }
//convertir de binario a Gray
cpp
String binToGray (String binario){ String gray; //se respeta el mas izquierdo gray = binario[1]; //XoR a los elementos for (int i = 1; i <= binario.Length(); i++) if (i < binario.Length()){ int a = binario[i]; int b = binario[i + 1]; int c = a^b; gray += String(c); //gray += IntToStr(StrToInt(binario[i])^StrToInt(binario[i+1])); } return gray; }
Espero les sirva...como a mi
#4
Posted 10 September 2010 - 10:16 AM
Te muestro una forma de realizarlo en binario:
Saludos.
cpp
DWORD BinToGray(DWORD N) { return N ^ (N>>1); } DWORD GrayToBin(DWORD N) { DWORD D = N; DWORD X; int i; for(i=0; D>1;i++) D>>=1; D<<=i; X = D; while(X>1){ N = N^((N&X)>>1); X>>=1; } return N; }
Saludos.
#5
Posted 10 September 2010 - 10:28 AM
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
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
#6
Posted 10 September 2010 - 01:05 PM
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.
Con la arítmética binaria te las puedes ingeniar para que el proceso sea mas veloz.
Saludos.