交换二进制数的奇偶位可以通过位运算高效实现,具体方法如下:
一、核心思路
提取奇偶位
- 使用掩码 `0x55555555` 提取奇数位(二进制 `01010101...`),使用掩码 `0xaaaaaaaa` 提取偶数位(二进制 `10101010...`)。
移位与合并
- 将提取的奇数位左移1位,偶数位右移1位,使奇数位覆盖原偶数位,偶数位覆盖原奇数位。
- 将两个移位后的结果进行按位或运算,完成奇偶位的交换。
二、实现方法
1. 使用掩码与移位
```c
include
int swap_bits(int x) {
return ((x & 0x55555555) >> 1) | ((x & 0xaaaaaaaa) << 1);
}
int main() {
int num = 10; // 二进制 00001010
printf("交换前: %d (0x%X)n", num, num);
printf("交换后: %d (0x%X)n", swap_bits(num), swap_bits(num));
return 0;
}
```
2. 使用宏定义
```c
define SWAP(n) ((n & 0x55555555) >> 1) | ((n & 0xaaaaaaaa) << 1)
int main() {
int num = 20; // 二进制 00010100
printf("交换前: %d (0x%X)n", num, num);
printf("交换后: %d (0x%X)n", SWAP(num), SWAP(num));
return 0;
}
```
三、示例解析
以 `10`(二进制 `00001010`)为例:
1. 提取奇数位:`10101010 & 0x55555555 = 00001010`
2. 提取偶数位:`10101010 & 0xaaaaaaaa = 00000000`
3. 移位合并:
- 奇数位左移1位:`00001010 << 1 = 00010100`
- 偶数位右移1位:`00000000 >> 1 = 00000000`
4. 最终结果:`00010100 | 00000000 = 00010100`(即 `5`)。
四、注意事项
该方法适用于32位整数,若处理其他位数需调整掩码(如8位整数使用 `0xFF`)。
宏定义需注意参数替换规则,避免与操作数冲突。
通过上述方法,可高效实现二进制奇偶位的交换,且代码简洁易懂。