我正试图改善面试风格的问题。 我偶然发现了这个:
给定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&amp; 1010101010101)&gt;&gt; 1之类的东西呢? 我最初尝试解决这个问题是将int转换为二进制字符串,然后交换相邻的字符然后转换回int。那会有用吗? 谢谢。
答案 0 :(得分:2)
您的值为int
十六进制的文字,
System.out.println(Integer.toBinaryString(0xaaaaaaaa));
System.out.println(Integer.toBinaryString(0x55555555));
哪个输出
10101010101010101010101010101010
1010101010101010101010101010101
可以将0xaaaaaaaa
替换为0b10101010101010101010101010101010
,将0x55555555
替换为0b1010101010101010101010101010101
,以获得相同的结果。