配對交換(力扣)
描述
配對交換。編寫程序,交換某個整數的奇數位和偶數位,儘量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。
示例1:
輸入:num = 2(或者0b10)
輸出:1 (或者 0b01)
示例2:
輸入:num = 3
輸出:3
提示:
num的範圍在[0, 2^30 - 1]之間,不會發生整數溢出。
題解
根據題目分析,基本採用位運算的方式,可使代碼段更加簡潔。
基本思路
取奇數位向右移一位得到A,取偶數位左移一位得到B,再將A與B做或運算,即可得到最終答案,至於如何利用位運算得到A和B?只要獲取奇數位和偶數位即可,即採用和兩個特殊的數字進行與運算得到。
ODD_BIT_BASK = 0xaaaaaaaa
EVEN_BIT_BASK = 0x55555555
代碼段
class Solution {
public:
int exchangeBits(int num) {
const int ODD_BIT_MASK = 0xaaaaaaaa;
const int EVEN_BIT_MASK = 0x55555555;
return (ODD_BIT_MASK & num) >> 1 | (EVEN_BIT_MASK & num) << 1;
}
};