2017-02-23 94 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