来源:力扣(LeetCode)
链接:面试题 05.07. 配对交换
题目
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例1:
输入:num = 2(或者0b10)
输出 1 (或者 0b01)
示例2:
输入:num = 3
输出:3
提示:
num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。
知识点:
-
偶数位为1,奇数位为0
0xaaaaaaaa = 10101010101010101010101010101010 -
偶数位为0,奇数位为1
0x55555555 = 1010101010101010101010101010101 -
1和0每隔两位交替出现
0x33333333 = 110011001100110011001100110011 -
0和1每隔两位交替出现
0xcccccccc = 11001100110011001100110011001100 -
1和0每隔四位交替出现
0x0f0f0f0f = 00001111000011110000111100001111 -
0和1每隔四位交替出现
0xf0f0f0f0 = 11110000111100001111000011110000
题目解析
- 分别获得偶数位与奇数位
0xaaaaaaaa 的偶数位为 1 ,奇数位为 0 ,则和原数进行与运算后可得到从0 开始的所有奇数位的数
0x55555555 的偶数位为 0,奇数位为 1 , 则和原数进行与运算后可得到从 0 开始的所有的偶数位的数 - 将从0 开始的偶数位的数左移,奇数位的数右移
- 进行或运算
代码
class Solution {
public int exchangeBits(int num) {
int res = 0;
int odd = num & 0x55555555 ;//奇数位为 1 (相当于从 0 开始的偶数位)
int even = num & 0xaaaaaaaa;//偶数位为 1 (相当于从 0 开始的奇数位)
odd <<= 1;
even >>= 1;
res = odd | even;
return res;
//return ((num & 0xaaaaaaaa) >> 1) | ((num & 0x55555555) << 1);
}
}