题目描述:将一个数的二进制的奇偶位对换位置。例如9的二进制1001 对换完成后为0110 变成了6。
解题思路:使用位运算将输入的数字和1010101010......(一共32位16对10)做与运算取出偶数位,然后再将输入的数字和0101010101......(一共32位16对10)做与运算取出奇数位。最后将偶数位右移一位,奇数位左移一位做异或运算实现奇偶位交换。
java代码:
public class 交换奇偶位 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 9;
int b = swap(a);
System.out.println(Integer.toString(a,2));
System.out.println(Integer.toString(b,2));
System.out.println(b);
}
public static int swap(int num) {
int ou = num & 0xaaaaaaaa; //和1010101010......做与运算取出偶数位
int ji = num & 0x55555555; //和0101010101......做与运算取出奇数位
return (ou>>1)^(ji<<1); //将偶数位右移一位,奇数位左移一位做异或运算实现奇偶位交换
}
}
C++代码:
#include<iostream>
using namespace std;
int main(){
int num,ji,ou;
cin>>num;
ou = num & 0xaaaaaaaa; // 十六进制转二进制一个a就是一个1010
ji = num & 0x55555555; // 0101
num = (ou>>1)^(ji<<1);
cout<<num;
return 0;
}