Aquí es la implementación de marcha atrás en Long:¿Cómo funciona (i << 48) | ((i & 0xffff0000L) << 16) | ((i > >> 16) & 0xffff0000L) | (i >>> 48) trabajo?
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;
}
puedo entender línea de 1,2,3,4, pero no 5! ¿Como funciona?
Agrupo los 64 bits a 8 grupos, es decir, 1 son los primeros 8 bits, 2 son los segundos 8 bits, y así sucesivamente.
Luego, después de la línea 4, la secuencia como 4,3,2,1,8,7,6,5
y creo que la línea 5 que trabaja como abajo antes de la operación |
:
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)
Pero, no sé donde la dosis mal o si ¡está mal! ¡Pensando en eso casi todo un día!
¡Alguien me puede ayudar! Gracias.
oh, he cometido un error como este:
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)
pero yo creo que es Alše mal! creo que la secuencia correcta es 8,7,6,5,4,3,2,1
lamento mucho que cometa algunos errores. funciona derecha como a continuación:
después de la línea 4, el patrón correcto es: 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)
Eso huele a dolor de cabeza, ¡espero que no haya sido una pregunta de entrevista! – Jerome
@Jerome Prefiero preferir salir de la cabina si se me pregunta en una entrevista .... – aProgrammer
no es una entrevista question.it es la implicación del método inverso en Long.java – liuxiaori