一、直接看题
题目:交换奇偶位
写一个宏,可以将一个数的二进制位的奇数位和偶数位交换
二、解题思路
小技巧:当看到题目时,不知道大家和作者是否一样,有点无从下手的感觉。这个时候我们就要拿起我们手中的笔, 去画一画。是的,这对解题十分有帮助,在以后的解题中画图观察的能力也十分重要!
1.简单写一写观察一下
为了方便观察,我们就先随便写一个有8个二进制位的数。
仔细看:
红色(偶数位)上的数都向右边移动了一位
蓝色(奇数位)上的数都向左边移动了一位
2.进一步思考
如果我们单纯的直接移位会得到什么结果呢?
分析:
单纯的左右移,能让红色和蓝色的数都去到了该去的地方
但是左右移后得到的两个数似乎得不到我们想要的结果,所以我们还需要对移位后的数再处理
和结果一对比,请看下图 ,如果右移后除了红色外其他地方都是0
如果左移后除了蓝色外其他地方都是0
再把两个数相加,那么我们就能得到我们想要的结果
回想刚才的想法,我们发现原来就是因为单纯的移位后,除了我们想要的数字会到指定的位置之外,其他位置上可能会出现1,从而使两个数在相加的时候会出现进位的情况而影响了我们的结果
所以我们需要将其他位置上的数都变成0
再次画图验证了我们的想法是正确的,那么接下来就按照我们的思路来实现代码
3.代码实现
通过上图的我们就能想到怎么去掉其他位置上的0
下面是代码实现:
注意:刚刚我们是用8位举例,实现时要记得一个整形是32位
#include<stdio.h>
#define SWAP(n) ((n>>1)&(0x55555555))+((n<<1)&(0xaaaaaaaa))
int main()
{
int n = 5;
int s=SWAP(n);
//n=5
//00000000 00000000 00000000 00000101
//00000000 00000000 00000000 00001010
//n=10
printf("%d\n", s);
s = SWAP(s);
printf("%d\n", s);
return 0;
}
三、简单测试我们的程序
上面是二进制转换,方便阅读
OK! 到这里就成功解决问题了
四、结语:
操作符的知识比起其他知识来说有点难,强烈建议大家反复观看,加强理解(别忘了动手写
其次动手画一画、写一写对解题很有帮助。
如果能将思路理清,那么写代码就是一件很简单的事情。
看到这,不知道你对操作符的了解是否更进一步了呢?作者建议大家反复观看,加深了解。
同时大家的点赞对作者很重要!
欢迎关注作者,作者会持续更新有趣的小问题,带你一起在有趣的问题中成长!