【题目】面试题 05.07. 配对交换
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例1:
输入:num = 2(或者0b10)
输出 1 (或者 0b01)
示例2:
输入:num = 3
输出:3
提示:
num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。
【解题思路1】获取奇数位/偶数位再合并
class Solution {
public int exchangeBits(int num) {
//奇数
int odd = num & 0x55555555;
//偶数
int even = num & 0xaaaaaaaa;
odd = odd << 1;
even = even >>> 1;
return odd | even;
}
}
【解题思路2】获取num的每位
然后通过判断奇数位还是偶数位再左移到指定的位置的方式实现
class Solution {
public int exchangeBits(int num) {
int ans = 0, count = 0;
while (num > 0) {
int last = (num & 1); //取得num的最后一位
num >>= 1;
if (count % 2 == 0)
last <<= 1 * (count + 1);
else
last <<= 1 * (count - 1);
ans |= last;
count++;
}
return ans;
}
}
class Solution {
public int exchangeBitsTwo(int num) {
int result = 0;
int addCount = 0;
while (num != 0){
int last = num & 1;
num >>= 1;
addCount++;
if (addCount % 2 == 0){
last <<= (addCount - 2);
}else {
last <<= addCount;
}
result |= last;
}
return result;
}
}