我们这里是利用按位与来计算的
我们可以想想怎么保留偶数上的位?我们可以利用0x55555555按位与上这个数就保留了偶数
我们知道,16进制0x55555555转换为二进制就是0x01010101010101010101010101010101
我们知道,二进制每一位,如果这个位是0,按位与1还是0,如果这个数是1,按位与1就是1
然后我们把计算的结果<<1,这样偶数上的位就在奇数位上了
奇数位一样的保留方法,我们可以利用0xaaaaaaaa按位与上这个数保留奇数
16进制0xaaaaaaaa转换为二进制就是0x10101010101010101010101010101010
我们把结果>>1,这样奇数位就在偶数位上了
#define SWAP(num) num = ((num&0x55555555)<<1)+((num&0xaaaaaaaa)>>1)
int main()
{
int num = 10;
//00000000000000000000000000001010 ->10
// 其奇偶位交换后得 :
//00000000000000000000000000000101 ->5
SWAP(num);
printf("%d", num);
return 0;
}