给定一个int x,交换其二进制的奇数位和偶数位,并返回交换后的数int。
测试样例:
10
返回:5
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int oddVal = (x & 0xAAAAAAAA); // bit 1 3 5 ... 31
int evenVal = (x & 0x55555555); // bit 0 2 4 ... 30
return (oddVal >> 1) + (evenVal << 1);
}
};
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int odd = ((x&0x55555555)<<1);
int even = ((x&0xAAAAAAAA)>>1)&0x7fffffff;
return even|odd;
}
};
首先要保证二进制的位数为偶数才能对换,所以若二进制位数为奇数,则需在开头添加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 );
}
public class Exchange {
public int exchangeOddEven(int x) {
// write code here
int[] before=new int[32];
int i=0;
while(x!=0){
before[i++]=x%2;
x/=2;
}
if(i%2!=0)
before[i++]=0;
for(int j=0;j<i;j+=2){
int tem=before[j];
before[j]=before[j+1];
before[j+1]=tem;
}
int ret=0;
for(int j=0;j<i;j++){
ret+=before[j]*Math.pow(2,j);
}
return ret;
}
} //略微复杂了一丝,不过时间复杂度还是可观的
/*思路:
设置两个位变量a和tempa,其中tempa=a<<1
举个例子:当x=5=0101
a从1开始,如果a&x与tempa&x的取零值不同,就说明奇数位和偶数位是不同的,
此时需要交换(如果相同则不需要处理)。
交换就非常简单了直接将x与a和tempa求异或即可!
然后将a与tempa分别向左移2位,开始下一对奇偶位比较
*/
class Exchange {
public:
int exchangeOddEven(int x) {
int a=1;
int tempx=x<<1;//防止x的最高位1是奇数位
while(a<=tempx)
{
int tempa=a<<1;
if(((tempa&x)==0)&&((a&x)!=0)||((tempa&x)!=0)&&((a&x)==0))
{
x=x^a;
x=x^tempa;
}
a=tempa<<1;
}
return x;
}
};
运行时间:3ms
占用内存:460k
import java.util.*;
public class Exchange {
public int exchangeOddEven(int x) {
// write code here
ArrayList<Integer> list1=new ArrayList<Integer>();
ArrayList<Integer> list2=new ArrayList<Integer>();//存储交换后的二进制
while(x!=0){
list1.add(x%2);
x/=2;
}
if(list1.size()%2!=0){ //将二进制位数强制为偶数
list1.add(0);
}
for(int i=list1.size()-1;i>=0;i=i-2){ //list1中的最后一个数为二进制数的首位
int temp=list1.get(i);
list2.add(list1.get(i-1));
list2.add(temp);
}
int result=0;
for(int j=0;j<list2.size();j++){
if(list2.get(j)==1){
result+=Math.pow(2,list2.size()-1-j); //二进制转换为十进制
}
}
return result;
}
}
class Exchange {
public:
int exchangeOddEven(int x) {
int ans=0;
for(int i=0;i<32;i+=2){
int bit1,bit2;
if((1<<i)&x)
bit1=1;
else
bit1=0;
if((1<<(i+1))&x)
bit2=1;
else
bit2=0;
ans+=(bit1<<(i+1))+(bit2<<i);
}
return ans;
}
};
# -*- coding:utf-8 -*-
class Exchange:
def exchangeOddEven(self, x):
return ((x & 0xaaaaaaaa) >> 1) | ((x & 0x555555555) << 1)
/** * 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 // 两者相加,得到交换二进制的奇数位和偶数位的值
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int n = 0 , m = 0 , x1 = x;//jishu
for(int i = 0 ; (1 << i) <= x ; i += 2)
if(x & (1 << i))
n += (1 << i);
for(int i = 1 ; (1 << i) <= x ; i += 2)
if(x & (1 << i))
m += (1 << i);
return (n << 1) + (m >> 1);
}
};