這裏是反向的長期實施:如何(我<< 48)| ((i&0xffff0000L)<< 16) | ((i > >> 16)&0xffff0000L)| (i >>> 48)工作?
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;
}
我能理解行1,2,3,4,而不是5!它是如何工作的?
我將64位分組爲8組,即1是前8位,2是後8位,依此類推。
4號線後然後,像4,3,2,1,8,7,6,5
和順序,我認爲5號線如下工作|
操作前:
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)
但是,我不知道在哪裏劑量錯了,還是這是錯誤的!幾乎要花一整天的時間思考它!
有人可以幫助我!謝謝。
哦,我犯了這樣一個錯誤:
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)
但我ALSE認爲這是錯誤的!我認爲正確的順序是8,7,6,5,4,3,2,1
我很抱歉,我犯了一些錯誤!它的工作原理如下權利:
線4之後,正確的模式是: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)
那味道頭痛,我希望它不是一個面試的問題! – Jerome 2012-03-02 07:00:25
@Jerome如果在採訪中被問到,我寧願離開客艙...... – aProgrammer 2012-03-02 07:02:26
不是面試question.it是Long.java中反向方法的含義 – liuxiaori 2012-03-02 07:03:50