要实现用宏交换一个数的偶数位和奇数位,首先要清楚如何使用宏,其次要有用宏实现该功能的整体思路。
例如:将数字5(0101)的奇数位和偶数位进行交换,得到10(1010);将数字10(A)的奇偶位交换,得到5。
那么假设我们要将x的奇偶位进行交换,我们可以将x&(0x55555555)得到x的奇数位,其偶数位都为零,然后左移一位,即(x&(0x55555555))<<1将x的奇数位放到偶数位;
再将x&(oxAAAAAAAA)得到x的偶数位,其奇数位全为0,然后右移一位,即(x&(oxAAAAAAAA))>>1将x的偶数位放在奇数位上;
再将两次的结果进行按位或运算,就能得到奇偶位交换后的数了。
源代码:
#define _CRT_SECURE_NO_WARNINGS 1
#define MACRO_SWAP(x) ( ((x & (0x55555555))<<1) | ((x & (0xAAAAAAAA))>>1))
#include <stdio.h>
int main()
{
int x = 0;
printf("请输入一个数:");
scanf("%d",&x);
printf("%d\n",MACRO_SWAP(x));
return 0;
}