【C语言】交换一个数的奇偶位——操作符的应用

一、直接看题


题目:交换奇偶位

写一个宏,可以将一个数的二进制位的奇数位和偶数位交换


二、解题思路


小技巧:当看到题目时,不知道大家和作者是否一样,有点无从下手的感觉。这个时候我们就要拿起我们手中的笔, 去画一画。是的,这对解题十分有帮助,在以后的解题中画图观察的能力也十分重要!


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! 到这里就成功解决问题了 

四、结语:

操作符的知识比起其他知识来说有点难,强烈建议大家反复观看,加强理解(别忘了动手写

其次动手画一画、写一写对解题很有帮助。

如果能将思路理清,那么写代码就是一件很简单的事情。


看到这,不知道你对操作符的了解是否更进一步了呢?作者建议大家反复观看,加深了解。

同时大家的点赞对作者很重要!

欢迎关注作者,作者会持续更新有趣的小问题,带你一起在有趣的问题中成长!

 

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值