Đây là việc thực hiện ngược lại tại Long:Làm cách nào (i << 48) | ((i & 0xffff0000L) << 16) | ((i > >> 16) & 0xffff0000L) | (i >>> 48) làm việc?
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;
}
tôi có thể hiểu dòng 1,2,3,4, nhưng không phải 5! Làm thế nào nó hoạt động?
Tôi nhóm 64 bit thành 8 nhóm, đó là 1 là 8 bit đầu tiên, 2 là 8 bit thứ hai, v.v.
Sau đó, sau khi dòng 4, trình tự như 4,3,2,1,8,7,6,5
và tôi nghĩ rằng dòng 5 làm việc như dưới đây trước khi phẫu thuật |
:
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)
Nhưng, tôi không biết nơi liều nó sai hay nó là sai! Suy nghĩ về nó gần như cả một ngày!
Ai đó có thể giúp tôi !! Cảm ơn.
oh, tôi đã phạm sai lầm như thế này:
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)
nhưng tôi alse nghĩ rằng đó là sai! tôi nghĩ rằng trình tự đúng là 8,7,6,5,4,3,2,1
tôi rất xin lỗi vì tôi đã phạm một số sai lầm! nó hoạt động đúng như sau:
sau dòng 4, mô hình bên phải là: 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)
Mùi đau đầu đó, tôi hy vọng đó không phải là câu hỏi phỏng vấn! – Jerome
@Jerome Tôi thà muốn rời khỏi cabin nếu nó được hỏi trong một cuộc phỏng vấn .... – aProgrammer
không phải là một câu hỏi phỏng vấn.nó là hàm ý của phương pháp đảo ngược trong Long.java – liuxiaori