题目链接
配对交换
题目描述
注意点
- num的范围在[0, 2^30 - 1]之间,不会发生整数溢出
解答思路
- 第一个思路是每次取奇数位和偶数位,将两位上的数字交换并根据其所处的位置求得的值与res相加,重复此过程即可
- 第二个思路是将所有的奇数位和偶数位都取出来,并将奇数位都向左移动一位,偶数位都向右移动一位,再将移动后的奇数位和偶数位相加(也就是’|'操作)即可
代码
方法一:
class Solution {
public int exchangeBits(int num) {
int res = 0;
int i = 0;
while (i < 32) {
int one = (num & 1);
if (one == 1) {
res += Math.pow(2, i + 1);
}
num >>= 1;
int two = (num & 1);
if (two == 1) {
res += Math.pow(2, i);
}
num >>= 1;
i += 2;
}
return res;
}
}
方法二:
class Solution {
public int exchangeBits(int num) {
// 奇数
int odd = num & 0x55555555;
// 偶数
int even = num & 0xaaaaaaaa;
odd = odd <<< 1;
even = even >>> 1;
return odd | even;
}
}
关键点
- 位运算的相关操作
- 求奇数位的方式是与0x55555555进行’&‘操作,求偶数位的方式是与0xaaaaaaaa进行’&'操作