面试题 05.07. 配对交换

题目:

配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。

示例1:

输入:num = 2(或者0b10)
输出 1 (或者 0b01)
示例2:

输入:num = 3
输出:3
提示:

num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。

 

解答:

老实人方法:

class Solution {
public:
    int exchangeBits(int num) {
        int x1,x2;
        for(int i=1;i<32;i+=2){
            x1=num&(1<<i);
            x2=num&(1<<(i-1));
            if(x1){
                num|=(x1>>1);
            }
            else{
                if(x2){
                    num^=(1<<(i-1));
                }
            }
            if(x2){
                num|=(x2<<1);
            }
            else{
                if(x1){
                    num^=(1<<i);
                }
            }
        }
        return num;
    }
};

评论区方法,惊呆了:

先筛选出奇数位,再筛选出偶数位。前者右移一位,后者左移一位再求或。

class Solution {
public:
    int exchangeBits(int num) {
        int odd = 0x2aaaaaaa & num;
        int even = 0x15555555 & num;
        odd >>= 1;
        even <<= 1;
        return odd | even;
    }
};

 

posted @ 2020-04-02 00:57  NeoZy  阅读(210)  评论(0编辑  收藏  举报