给定一个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); } };