De http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
El literal hexadecimal 0xFF es un int (255) igual. Java representa int como 32 bits. Se ve así en binario:
00000000 00000000 00000000 11111111
Cuando lo hace un poco Y con este valor (255) en cualquier número, va a enmascarar (hacer CERO) todos menos los 8 bits más bajos del número (será como está).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
& es algo así como% pero no realmente .
¿Y por qué 0xff? esto en ((potencia de 2) - 1). Todos ((potencia de 2) - 1) (por ejemplo, 7, 255 ...) se comportarán de forma similar al operador%.
Luego,
en binario, 0 es, todo ceros y 255 se ve así:
00000000 00000000 00000000 11111111
Y -1 se ve así
11111111 11111111 11111111 11111111
Cuando hace un AND bit a bit de 0xFF y cualquier valor de 0 a 255, el resultado es exactamente el mismo que el valor. Y si todavía hay algún valor superior a 255, el resultado estará entre 0-255.
Sin embargo, si lo hace:
-1 & 0xFF
usted obtiene
00000000 00000000 00000000 11111111
, que NO es igual al valor original de -1 ( 11111111
es 255 en decimal).
Pocas manipulaciones de bits más: (No relacionado con la pregunta)
X >> 1 = X/2
X << 1 = 2X
Verifique que cualquier bit en particular esté establecido (1) o no (0) luego
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
Establecer (1) un bit en particular
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
Restablecer (0) un bit en particular
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
Solo tenga en cuenta que si realiza la operación XOR dos veces, obtendrá el mismo valor.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
Una lógica más con XOR es
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
Lo anterior es útil para intercambiar dos variables sin temperatura como a continuación
a = a ^ b; b = a ^ b; a = a ^ b;
O
a ^= b ^= a ^= b;