写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换

我们这里是利用按位与来计算的

我们可以想想怎么保留偶数上的位?我们可以利用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;
}