Da http://www.coderanch.com/t/236675/java-programmer-SCJP/certification/xff
Il valore letterale esadecimale 0xFF è un int uguale (255). Java rappresenta int come 32 bit. Sembra questo in binario:
00000000 00000000 00000000 11111111
Quando esegui un AND un po 'saggio con questo valore (255) su qualsiasi numero, maschererà (renderà ZERO) tutti tranne gli 8 bit più bassi del numero (saranno così com'è).
... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101
& è qualcosa come% ma non proprio .
E perché 0xff? questo in ((potenza di 2) - 1). All ((power of 2) - 1) (eg 7, 255 ...) si comporterà in modo simile all'operatore%.
Quindi
in binario, 0 è, tutti zeri e 255 ha questo aspetto:
00000000 00000000 00000000 11111111
E -1 assomiglia a questo
11111111 11111111 11111111 11111111
Quando si esegue un AND bit per bit di 0xFF e qualsiasi valore compreso tra 0 e 255, il risultato è esattamente lo stesso del valore. E se qualsiasi valore superiore a 255, il risultato sarà comunque compreso tra 0 e 255.
Tuttavia, se lo fai:
-1 & 0xFF
ottieni
00000000 00000000 00000000 11111111
, che NON è uguale al valore originale di -1 ( 11111111
è 255 in decimale).
Qualche altra manipolazione di bit: (non correlata alla domanda)
X >> 1 = X/2
X << 1 = 2X
Verificare che un bit particolare sia impostato (1) o meno (0)
int thirdBitTobeChecked = 1 << 2 (...0000100)
int onWhichThisHasTobeTested = 5 (.......101)
int isBitSet = onWhichThisHasTobeTested & thirdBitTobeChecked;
if(isBitSet > 0) {
//Third Bit is set to 1
}
Imposta (1) un bit particolare
int thirdBitTobeSet = 1 << 2 (...0000100)
int onWhichThisHasTobeSet = 2 (.......010)
onWhichThisHasTobeSet |= thirdBitTobeSet;
ReSet (0) un particolare bit
int thirdBitTobeReSet = ~(1 << 2) ; //(...1111011)
int onWhichThisHasTobeReSet = 6 ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;
XOR
Tieni presente che se esegui due volte l'operazione XOR, risulterà lo stesso valore.
byte toBeEncrypted = 0010 0110
byte salt = 0100 1011
byte encryptedVal = toBeEncrypted ^ salt == 0110 1101
byte decryptedVal = encryptedVal ^ salt == 0010 0110 == toBeEncrypted :)
Un'altra logica con XOR è
if A (XOR) B == C (salt)
then C (XOR) B == A
C (XOR) A == B
Quanto sopra è utile per scambiare due variabili senza temp come sotto
a = a ^ b; b = a ^ b; a = a ^ b;
O
a ^= b ^= a ^= b;