寒假提升(5)[利用位操作符的算法题]

日子是一天天地走,书要一页页地读。 ——毕淑敏


位操作符的合理使用来解决问题

1、题目大概

题目要求让我们把一个数字用二进制表示出来的时候,将他的奇数位置和偶数位置交换,就比方说
num=2(0b10)交换过之后是1(0b01) 这种方式。
这里是题目的链接

2、理解和想办法解决

对于这种方式的题目,其实我之前关于怎么让一个数知道他的二进制位有多少1或者是0一样(虽然这又是可以讲一大堆关于这个题目的,如果后期有空,我会把这题也单独开一个文章)。在我的心里,我觉得有一种方法,就是通过位操作符来解决,因为关于二进制位的底层存储的方式,大部分还都是通过这些方法来解决。
那么,就应该思考,究竟什么样子才能使得偶数位置和奇数位置两个交换呢?首先,根据题目,我们知道数据的最大是在2的30次方-1那么其实也就是意味着,这个最大的数也是能够左移两次,那么奇数位置左移,偶数位置向右移(因为偶数最小是在第二位,能够向右移,但是奇数最小是在第一位,只能向左移)。
其实现在的问题是,怎么能够单纯的得到奇数位置和偶数位置的二进制数?
这个时候,位操作符在4个之中该怎么选择呢?
在这里插入图片描述
还有一个是按位取反。当然,这题里面按位取反应该也是没什么用的。
记住对于提取来说&(按位与)是最好的,因为可以控制让原来的数什么位置留下,什么位置不留下。&(按位与)的作用是,在两个数中,有0的则为0,只有相同为1的时候才为1。
所以!想要留下偶数和奇数位置的数,只需要

 int a=0b10101010101010101010101010101010;
 int b=0b01010101010101010101010101010101;

再分别去&上num这个数,得到的两个数,就会是分别的奇数和偶数的位置。奇数 <<一位,偶数>>一位,将再次得到的数,通过按位或来结合。按位或:有1则为1,相同为0才为0,这样就能结合出来,奇数位置和偶数位置相互调换的数。

3、结果

在这里插入图片描述
这样也就算是,合理的通过了这道,使用位操作符的算法题。

  • 17
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值