2009-04-23 8 views
6

Necesito hacer un cálculo inverso, que consiste en la operación AND a nivel de bit, ¿cómo lo hago?¿Cuál es el inverso de Y a nivel de bits en C#?

Probé O exclusivo, pero no ayudó.

 int i = 254 & 2; 
     Console.Write("254 & 2 ={0}", i + "\n"); 
     Console.Write("{0}^2 ={1}",i, (i^2) + "\n"); 

No funciona. ¿Cómo hago ese cálculo?

+3

Cuando dices "No funciona", ¿qué quieres decir? Compila y produce el resultado esperado para mí. ¿Qué resultado muestra para usted y, lo que es más importante, qué resultado desea que muestre? –

+0

La única operación de bit a bit reversible que tiene es XOR, entonces '(a^b)^b == a'. Si desea revertir su operación y no está completamente configurado para usar AND, intente esto en su lugar. – Blindy

Respuesta

27

Dado i, no puede recuperar 254. Por & ing le ha destruido qué datos no se almacenaron en el segundo bit.

1111 1110 
&0000 0010 
---------- 
0000 0010 

¿Cómo recuperarías los 6 bits perdidos? Para x & 2 == 2, podría poner casi cualquier x y sería cierto.

0010 1010 // = 42 
&0000 0010 
---------- 
0000 0010 

¿Es x 254 o 42? No puedes decir.

3

No puede, ha perdido los datos que estaban allí cuando hizo el &.

ejemplo 4 bits:

1110 & 0010 = 0010 

Usted no tiene manera de saber qué partes eran 1 y que no eran si sólo sabe el resultado 0010 y el segundo operando de la & (también 0010).

21

Técnicamente lo contrario de Y es NAND:

~ (254 & 2)

Tenga en cuenta que el ~ es el operador de complemento, y hace un bit a bit NO (alternar cada bit de su opuesto).

¿Qué es exactamente lo que quieres, sin embargo? ¿Qué está tratando de lograr?

Si está tratando de deshacer el cálculo, no puede - no hay una función inversa tal que inversa y (y (x, y)) devolverá x o y, incluso si se da uno inverso de ellos.

-Adam

+2

+1 en parte porque * creo * estás en el camino correcto, pero principalmente por la pregunta "¿qué quieres?", Que es realmente el problema aquí ... no es completamente obvio lo que está tratando de hacer. – Beska

0

¿Qué quiere decir con cálculo opuesto?

Si ve el número 254 como un bit de registro que consta de 8 bits, entonces todos los bits pero el último se establece en 1.

Calcular 254 & 2 es lo mismo que verificar si se ha configurado el bit número 2 en el registro.

¿Qué es lo opuesto a esto? ¿Verifica si todos los demás bits están configurados?

0

Si el propósito de la operación & es verificar si el bit 1 está configurado, entonces una posible operación "opuesta" es "establecer el bit 1".

es decir .:

val = val | 2; 

Esto sobrescribe el valor actualmente en el bit 2, y no toca ningún otro poco.

Si los 8 bits en el byte se consideran bits completamente independientes, entonces es posible cambiar cualquiera de ellos tocando cualquiera de los demás.

En este caso, no importa que se haya perdido parte de la información original. En realidad, no nos importa qué valor tienen los otros bits, y la mayoría de las veces al usar máscaras de bits, el valor original del bit en cuestión era cero de todos modos.

Cuestiones relacionadas