既然是交换奇偶数位,我们就可以分别将二进制中的奇数位与偶数位分别提取出来,错位后再按位或就可以得到奇偶数位交换的效果。
整数10的二进制位为:
00000000 00000000 00000000 00001010
分别提取奇偶数位可以借助整数分别按位与‘&’0xaaaaaaaa(提取奇数位),0x55555555(提取偶数位)
【0xaaaaaaaa->二进制:10101010101010101010101010101010
0x55555555->二进制:01010101010101010101010101010101 】
提取后将提取出的奇数位向左移1位,提取出的偶数位向右移1位
最后再按位或就可以得到交换后的整数
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#define SWAP(N) (((N) & 0xaaaaaaaa)>>1) | (((N) & 0x55555555)<<1)
int main()
{
int n = 10;
printf("%d\n", SWAP(n));
return 0;
}
在写宏的时候注意括号的使用