logical left funcion bitwise c++ c xor

left - xor c++



XORing "Hello World!" Corta la cuerda (3)

Debido a que ''o'' es el código ASCII 111, y XORing 111 con 111 produce 0, NUL , y termina su cadena. Una vez que esto sucede (incluso en el primer bucle, ya que lo estás evaluando cada vez que pasa por el bucle), strlen informa que la cadena es mucho más corta y que los bucles se detienen.

Guardar la longitud de la cadena antes de pasar por los XORs te salvará de esto.

#include <stdio.h> #include <string.h> int main() { char greeting[]="/nHello World!/n"; int a; for(int i=0; i<strlen(greeting); i++) greeting[i]^=111; for(int i=0; i<strlen(greeting); i++) greeting[i]^=111; printf("%s/n",greeting); scanf("%d",&a); }

Salida:

Hell

¿Por qué corta todo después de detectar una letra correspondiente al número de la clave XOR (en este caso, ASCII ''w'')? En lógica matemática, N^N=0 y 0^N=N , ¿no es así?


Esto se debe a que cuando usted o un número consigo mismo, se convierte en cero, y cuando strlen ve cero, piensa que es el final de la cadena.

Si almacena la longitud en una variable antes del primer bucle y luego utiliza esa longitud guardada en su segundo bucle en lugar de strlen, su programa producirá el resultado esperado.


greeting[5] es ''o'' que es 111 en ASCII. Por lo tanto, el saludo [5] ^ 111 será cero (lo que terminará su cadena) El strlen en el segundo bucle devolverá un valor diferente.

Para solucionar este problema, utilice una variable len para almacenar el strlen original. Obtendrá su cadena de nuevo!

Modificado:

#include <stdio.h> #include <string.h> int main() { char greeting[]="/nHello World!/n"; int a; int len = strlen(greeting); for(int i=0; i<len; i++) greeting[i]^=111; for(int i=0; i<len; i++) greeting[i]^=111; printf("%s/n",greeting); scanf("%d",&a); }