2017-02-23 88 views
-2

我試圖改進面試風格問題。 我碰到過這個:請解釋此位交換代碼(Java)

給定一個32位整數輸入x,交換其奇數和偶數位,並返回結果整數。 (例如,比特0和比特1被交換,比特2和比特3被交換,等等)。 例如: X = 5,二進制代碼= 0101 swapOddEvenBits(5) - > 10

答案如下:

public int swapOddEvenBits(int x) { 

return (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1)); 

} 

有人可以解釋這一點,請。 另外,爲什麼我不能使用像(x & 1010101010101)>> 1而不是? 我最初嘗試解決這個問題是將ints轉換爲二進制字符串,然後交換相鄰的字符,然後轉換回int。這會起作用嗎? 謝謝。

回答

2

你的值是十六進制int文字,

System.out.println(Integer.toBinaryString(0xaaaaaaaa)); 
System.out.println(Integer.toBinaryString(0x55555555)); 

,輸出

10101010101010101010101010101010 
1010101010101010101010101010101 

可以0b101010101010101010101010101010100x555555550b1010101010101010101010101010101了相同的結果替換0xaaaaaaaa

+0

謝謝你的解釋。 – Raul