Buenas, he estado leyendo sobre ofuscación del código y lo único que he leído es lo que viene en la wikipedia, que supongo que será lo más básico sobre esto, según la wikipedia:
int int_;
Estaríamos definiendo una variable entera, hasta ahí bien.
_int-_int;
Esto sería = 0
(_int-_int)!;
Y esto sería = 1, y aqui llega lo que no entiendo, por qué el resultado de la siguiente línea es 10:
(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))|(!(int_-int_)<<!(int_-int_)));
Saludos.
Porque el operador << lo que hace es desplazar bits a la izquierda. Tiene la siguiente sintaxis:
variable << num_bits_a_desplazar
Es decir, que si haces, 1 << 1 lo que estás haciendo es desplazar un bit a la izquierda, es decir que pasarias de 0001 a 0010. El resultado sería 2 (0010).
Esa sentencia en primer lugar lo que hace es desplazar 4 bits a la izquierda: 1 << 1 << 1 << 1. O sea que lo que está haciendo es: 0001 -> 0010 -> 0100 -> 1000. El resultado es 8 (1000).
Luego, a ese resultado le aplica un OR (|). 1000 | 0010 sería 1010.
En resumen, hace lo siguiente:
(1 << 1 << 1 << 1) | (1 << 1)
(1000) | (0010) = 8 | 2
1010 = 10
Vale, el desplazamiento de bits lo entiendo, y por lógica supongo que el operador que utiliza OR (|) no tendrá nada que ver con el operador de comparación sino que este será a nivel de bits, ¿qué función tiene?
Saludos y gracias.
Es un operador de bits donde el bit resultante es 1 si los bits son distintos y 0 si son iguales. Una pagina con una explicación a detalle de esos operadores (en general, no especifico de C) es Wikipedia: Bitwise operation (http://en.wikipedia.org/wiki/Bitwise_operation).
Un saludo
Buenas,
Te explico según lo entiendo. La primera parte del código (antes del OR), lo que hace es desplazar 3 bits a la derecha.
Entonces, la parte de la línea (Puede que esté mal la cantidad de paréntesis):
(((!(int_-int_)<<!(int_-int_))<<(!(int_-int_)<<!(int_-int_)))
Sería lo mismo que poner:
1<<1<<1<<1;
1
10 --> Primer desplazamiento.
100 --> Segundo desplazamiento.
1000 --> Tercer desplazamiento.
La segunda parte del código:
(!(int_-int_)<<!(int_-int_)));
Sería:
1<<1;
1
10 --> Primer desplazamiento.
Y ahora realiza la operación OR. Está es una operación lógica que devuelve verdadero (en este caso 1) cuando uno de los operandos o ambos, sean verdaderos (o 1). Entonces:
1000 | 10
Hace la siguiente comparación (bit a bit):
1 OR 1 = 1
0 OR 0 = 0
0 OR 1 = 1
0 OR 0 = 0
Dando como resultado 1010. 10 en decimal.
Un saludo.
Cita de: rir3760 en 10 Noviembre 2013, 02:44 AM
Es un operador de bits donde el bit resultante es 1 si los bits son distintos y 0 si son iguales. Una pagina con una explicación a detalle de esos operadores (en general, no especifico de C) es Wikipedia: Bitwise operation (http://en.wikipedia.org/wiki/Bitwise_operation).
Un saludo
Según la explicación que ha dado
csp el resultado es 1 si alguno de los dos bits es 1, no tienen porque ser los dos, y asi si que ya tiene sentido la operación, ya lo he entendido todo.
Gracias.
Cierto, la definición que di fue la del operador XOR '^'. Mea culpa.
Un saludo