写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换。
1、要交换奇数位和偶数位,只需要将奇数位全部提取出来向左移动一位
2、要交换偶数位和奇数位,只需要将偶数位全部提取出来向右移动一位
3、再将上述两步的结果合并
1、如何提取奇数位
奇数位一般在第1、3、5 … 29、31上
设计一个序列在这几个位上为1,其他位上为0,然后相与,可得出原始的奇数位上的数字,而偶数位上都是0
如10的二进制为
10: 00000000 00000000 00000000 00001010
提取器:01010101 01010101 01010101 01010101
得到: 0000000 0000000 0000000 0000000
2、如何提取偶数位
10: 00000000 00000000 00000000 00001010
提取器:10101010 10101010 10101010 10101010
得到: 0000000 00000000 00000000 00001010
偶数得到的向右一位,奇数得到的向左一位
奇数左移1位:00000000 00000000 00000000 00000000
偶数右移1位:00000000 00000000 00000000 00000101
相或(加)得:0000000 00000000 00000000 00000101
十六进制: 00 00 00 05
#include "stdio.h"
//01010101 01010101 01010101 01010101 55 55 55 55
//00000000 00000000 00000000 00001010 00 00 00 0a
//10101010 10101010 10101010 10101010 aa aa aa aa
#define EXC(n) ((n & 0xaaaaaaaa)>>1) | ((n & 0x55555555)<<1)
int main(){
int n = 10;
int ret = EXC(n);
printf("%p ", ret);
return 0;
}