题目链接
配对交换
题目描述
注意点
- 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进行’&'操作