Qui è l'attuazione di inversione a Long:Come funziona (i << 48) | ((i & 0xffff0000L) << 16) | ((i > >> 16) e 0xffff0000L) | (io >>> 48) lavoro?
public static long reverse(long i) {
// HD, Figure 7-1
i = (i & 0x5555555555555555L) << 1 | (i >>> 1) & 0x5555555555555555L;//1
i = (i & 0x3333333333333333L) << 2 | (i >>> 2) & 0x3333333333333333L;//2
i = (i & 0x0f0f0f0f0f0f0f0fL) << 4 | (i >>> 4) & 0x0f0f0f0f0f0f0f0fL;//3
i = (i & 0x00ff00ff00ff00ffL) << 8 | (i >>> 8) & 0x00ff00ff00ff00ffL;//4
i = (i << 48) | ((i & 0xffff0000L) << 16) |
((i >>> 16) & 0xffff0000L) | (i >>> 48);//5
return i;
}
posso capire la linea 1,2,3,4, ma non 5! Come funziona?
I raggruppa i 64 bit in 8 gruppi, ovvero 1 è il primo 8 bit, 2 è il secondo 8 bit e così via.
Poi, dopo la linea 4, la sequenza come 4,3,2,1,8,7,6,5
e penso che la linea 5 a lavorare come di seguito prima dell'operazione |
:
6,5,0,0,0,0,0,0-->(i << 48)
8,7,0,0,0,0,0,0-->((i & 0xffff0000L) << 16)
0,0,0,0,4,3,2,1-->((i >>> 16) & 0xffff0000L)
0,0,0,0,0,0,2,1-->(i >>> 48)
Ma, io non so dove dose di sbagliato o se è sbagliato! Pensaci quasi un giorno intero!
Qualcuno può aiutarmi !! Grazie.
oh, ho fatto un errore come questo:
6,5,0,0,0,0,0,0-->(i << 48)
0,0,8,7,0,0,0,0-->((i & 0xffff0000L) << 16)
0,0,0,0,2,1,0,0-->((i >>> 16) & 0xffff0000L)
0,0,0,0,0,0,4,3-->(i >>> 48)
ma ho ALSE credo che sia sbagliato! Penso che la sequenza corretta sia 8,7,6,5,4,3,2,1
mi dispiace tanto che faccio degli errori! funziona a destra come sotto:
dopo la linea 4, il modello di destra è: 2,1,4,3,6,5,8,7
8,7,0,0,0,0,0,0-->(i << 48)
0,0,6,5,0,0,0,0-->((i & 0xffff0000L) << 16)
0,0,0,0,4,3,0,0-->((i >>> 16) & 0xffff0000L)
0,0,0,0,0,0,2,1-->(i >>> 48)
Che odori mal di testa, spero che non sia stata una domanda di intervista! – Jerome
@Jerome Preferisco piuttosto lasciare la cabina se viene chiesto in un'intervista .... – aProgrammer
non un'intervista question.it è l'implicazione del metodo inverso in Long.java – liuxiaori