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

2024-02-08 08:18:26 浏览数 (1)

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

算法
  • 位操作符的合理使用来解决问题
    • 1、题目大概
    • 2、理解和想办法解决
    • 3、结果

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

1、题目大概

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

2、理解和想办法解决

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

还有一个是按位取反。当然,这题里面按位取反应该也是没什么用的。 记住对于提取来说&(按位与)是最好的,因为可以控制让原来的数什么位置留下,什么位置不留下。&(按位与)的作用是,在两个数中,有0的则为0,只有相同为1的时候才为1。 所以!想要留下偶数和奇数位置的数,只需要

代码语言:javascript复制
 int a=0b10101010101010101010101010101010;
 int b=0b01010101010101010101010101010101;

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

3、结果

这样也就算是,合理的通过了这道,使用位操作符的算法题。

0 人点赞