日子是一天天地走,书要一页页地读。 ——毕淑敏
算法
- 位操作符的合理使用来解决问题
- 1、题目大概
- 2、理解和想办法解决
- 3、结果
位操作符的合理使用来解决问题
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、结果
这样也就算是,合理的通过了这道,使用位操作符的算法题。