假设这个数为n=00000000 00000000 00000000 00001101——13
1.思路
1.1 奇数位:00000000 00000000 00000000 00000101
但是怎么获得奇数位呢?——进行按位与运算
不懂如何运算的可以看我主页的详解操作符-CSDN博客,该章详细写了各个操作符如何运算
1.2 偶数位:00000000 00000000 00000000 00001000
同样获得偶数位——进行按位与运算
1.3 获得奇数和偶数位以后,我们需要交换位置,所以要将奇数位的数放到偶数位——<<1
00000000 00000000 00000000 00001010
1.4 偶数位的数放到奇数位去——>>1
00000000 00000000 00000000 00000100
1.5 最后,将两个数进行按位或计算即可完成交换(按位或运算:两个数为0才为0)
2. 宏的定义
2.1
- 01010101 01010101 01010101 01010101转换为16进制:0x55 55 55 55
- 10101010 10101010 10101010 10101010转换为16进制:0xaa aa aa aa
- ( ( ( ( n ) & 0x55555555 ) << 1 ) | ( ( ( n ) & 0xaaaaaaaa ) >> 1 ) ) ) )
2.2 最终代码实现
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#define exchange(n) ( ( ( ( n ) & 0x55555555 ) << 1 ) | ( ( ( (n ) & 0xaaaaaaaa ) >> 1 ) ) )
int main()
{
int ret = exchange(13);
printf("%d", ret);
return 0;
}