这里的奇数偶数进行交换是将他的二进制数进行的奇数偶数位进行交换,既然是对二进制进行交换了那大家自然也就想到了按位与按位或这种二进制操作。
0x55555555是十六进制的:01010101010101010101010101010101。
0xaaaaaaaa是十六进制的:10101010101010101010101010101010。
所以开始先将n和0x55555555按位与,求出来n的所有奇数位置的数字,然后将求得的数左移一位,现在的数字就是将n的奇数位的所有内容放到了偶数位置.
这时候只要求出来n的偶数为然后放到奇数位置就可以了,所以先移动n向左移虽然这时候n的32位少了一个0,并不影响, 然后将两个求得的数字进行或运算,就能将这个数字的32位二进制的奇数位和偶数位进行交换。
代码如下:
//宏,将一个整数的二进制位的奇数位和偶数位交换。
#include<stdio.h>
#define FSWAP(N) (((N&0X55555555)<<1)|((N&0xaaaaaaaa)>>1))
int main()
{
int n = 0;
printf("请输入一个数字\n");
scanf("%d", &n);
printf("%d", FSWAP(n));
return 0;
}