用一行代码(宏)交换一个二进制整数的奇数位和偶数位
默认二进制数的最低为为奇数位
如果对位运算还不太熟悉,建议先看看👉传送门
·我们以一个例子来分析,例如:
对于二进制数0111 0100 1101 0101
我们交换奇偶位后就变成了:
我们发现,相较于交换前,交换后奇数位整体向左移动了一个单位,偶数位整体向右移动了一个单位
因此,我们只需要将这个数的奇数位和偶数位都提取出来,然后再分别对其进行移动,最后再合并就可以了
- 要提取奇数位,就需要将每一个奇数位和1进行按位与操作,而数字5的二进制
0101
刚好符合每一个二进制位为1的特点,因此要提取奇数位,我们可以这么写:
num & 0x55555555
- 同理,要提取偶数位,就需要一个数字的二进制偶数位都为1,而数字10的二进制
1010
刚好符合
num & 0xAAAAAAAA
- 将奇数位向左移动一位,偶数位向右移动一位,最后再按位或,就可以实现交换二进制整数的奇偶位了
实现代码:
#define EXCHANGE(num) ((num & 0xAAAAAAAA) >> 1) | ((num & 0x55555555) << 1)