天天看点

写一个宏,将一个数的奇数位和偶数位交换

我们知道交换两个数的方法,而这个问题说的是将一个数的奇数位和偶数位交换,并且用宏实现,所以这个问题的主要障碍不是写一个宏,而是怎样提取奇数和偶数,只有提取奇数位和偶数位,那么一切都好说。现在我来说一种很神奇的方法,至少在我一筹莫展时看到后感觉很神奇。

其实说起来也没什么大不了的,就是将原数字 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 ;
}
           

继续阅读