给定一个int x,交换其二进制的奇数位和偶数位,并返回交换后的数int。
测试样例:
10
返回:5
/** * 0xaaaaaaaa=10101010101010101010101010101010(偶数位为1,奇数位为0) * 0x55555555=1010101010101010101010101010101(偶数位为0,奇数位为1) */ int odd = x & 0x55555555;// 将偶数位全部清零,奇数位1保留 int even = x & 0xaaaaaaaa;// 将奇数位全部清零,偶数位1保留 return (odd<<1) + (even>>1); // 将odd全部往左移一位,即将偶数位0全部变为奇数位0,原奇数位的1变为偶数位的1 // 将even全部往右移位一位,即将奇数位0全部变为偶数位0,原偶数位1变为奇数位1 // 两者相加,得到交换二进制的奇数位和偶数位的值
首先要保证二进制的位数为偶数才能对换,所以若二进制位数为奇数,则需在开头添加0.
public int exchangeOddEven(int x) {
// 将十进制int转换成二进制字符串
String binStr = Integer.toBinaryString(x);
// 若二进制位数为奇数,则在最前端补0
if ( binStr.length()%2 == 1 )
binStr = "0"+binStr;
char[] charArray = binStr.toCharArray();
for ( int i=1; i<charArray.length; i+=2 ) {
char temp = charArray[i-1];
charArray[i-1] = charArray[i];
charArray[i] = temp;
}
// 将二进制字符串转换成十进制整数
return Integer.valueOf( new String(charArray), 2 );
}