文章目录
- 一. 二进制奇偶位交换说明意思?
- 二. 解题思路
- 三. 代码验证
- 四. 总结
一. 二进制奇偶位交换说明意思?
- 就是一个int类型的整数在操作系统下是32位二进制01序列,第一位和第二位交换,第二位和第三位交换,依次类推。
- 交换奇偶位,需要先分别拿出奇偶位。既然是宏,分别拿出用循环不是很现实,那就用&这些位的方式来做。
二. 解题思路
奇数位拿出,那就是要&上010101010101……,偶数位拿出,就是要&上101010101010……,对应十六进制分别是555……和aaa……,一般我们默认是32位整数,4位对应一位16进制就是8个5,8个a。通过& 0x55555555的方式拿出奇数位和& 0xaaaaaaa的方式拿出偶数位。奇数位左移一位就到了偶数位上,偶数位右移一位就到了奇数位上,最后两个数字或起来,就完成了交换。
举例10这个数字:
- 二进制序列00000000000000000000000000001010
- 奇位置0,将10位&上01010101010101010101010101010101
结果:00000000000000000000000000000000 - 偶位置0, 将10位&上10101010101010101010101010101010
结果:00000000000000000000000000001010 - 将步骤二结果左移一位:00000000000000000000000000000000
- 将步骤三结果右移一位:00000000000000000000000000000101
- 将步骤四和步骤五结果相加即使答案:
00000000000000000000000000000101
最终交换后结果为5
三. 代码验证
#include<stdio.h>
#define SWAP(n) (((n&0x55555555)<<1)+((n&0xaaaaaaaa)>>1))
int main()
{
int n = 0;
scanf("%d", &n);
printf("交换后%d", SWAP(n));
return 0;
}
四. 总结
既然使奇偶交换,第一步先将奇数位全变0,那么就可以将偶数位全左移一位到奇数位,第二步将偶数位全变0,将奇数位全右移一位到偶数位,两结果相加就实现了奇偶交换
最后小编制作不易,麻烦各位兄弟们,点点关注!