思路
将目标二进制的奇数位和偶数位单独提取出来。
将奇数位往左移一位,将偶数位往右移一位。
移动完两者再进行相加,便得到二进制位的奇数位和偶数位交换后的整数。
重点
如何将目标整数二进制的奇数位和偶数位单独提取出来
//偶数位全1,奇数位全0
10101010 10101010 10101010 10101010
//转化为十六进制为0xAAAAAAAA
//偶数位全0,奇数位全1
01010101 01010101 01010101 01010101
//转化为十六进制为0x55555555
用以上整数与目标整数分别进行位与(&),可以对应得到目标整数二进制的奇数位和偶数位整数。
作答
#include <stdio.h>
#define SWAP(x) ((0xAAAAAAAA & x) >> 1) + ((0x55555555 & x) >> 1)
void main()
{
//二进制形式:00000000 00000000 00000000 00001010
int num = 10;
//SWAP(num)之后二进制形式:00000000 00000000 00000000 00000101
printf("%d\n", SWAP(num));
}