天天看點

寫一個宏,将一個數的奇數位和偶數位交換

我們知道交換兩個數的方法,而這個問題說的是将一個數的奇數位和偶數位交換,并且用宏實作,是以這個問題的主要障礙不是寫一個宏,而是怎樣提取奇數和偶數,隻有提取奇數位和偶數位,那麼一切都好說。現在我來說一種很神奇的方法,至少在我一籌莫展時看到後感覺很神奇。

其實說起來也沒什麼大不了的,就是将原數字 x 與01序列進行按位與運算,例如:13—->1101,要提取其奇數位,隻需要将其與0x5555 5555(其實就是0101 0101……)按位與之後即可,同樣的,要提取偶數位,隻需将其與0xAAAA AAAA(其實是1010 1010……)按位與即可。

那麼這個問題但這裡就簡單了,想要交換,隻需将奇數位左移,偶數位右移一位,之後将得到的結果按位或即可。

下面我們來實作這個程式吧:

#include<stdio.h>
#include<stdlib.h>
#define CHANGE(x)  ((x & (0x55555555))<<1)|((x & (0xAAAAAAAA))>>1)
int main()
{
    int x=;
    printf("Please Enter:");
    scanf("%d",&x);
    printf("%d\n",CHANGE(x));
    system("pause");
    return ;
}
           

繼續閱讀