以下我将介绍一下位运算的几种高级操作以及其的基本思路
首先最基本的基本操作有:
1:&:与:比对同一位次上的两个数:同为1,结果才为1,有1个为0,结果就为0
那么我们可以进行延伸:
问题:如何根据&与运算来改变某一个数x呢?注:这里我们统一将x看作11010
答:这个时候我们可以对应被改变的数x的位次,引进二进制的所有位次上的值全为1的数y,此时当我们对这两个数进行操作x&y,我们可以计算出结果仍为x,他的值并没有改变,而当我们想改变x的话,我们这时候引进y,让x要改变的某一位对应在y上那一位的数从1变成0,在对x,y进行x&y操作我们马上可以发现对应的值马上变成了我们想要的值
2:或:|:比对同一位次上的两个数:同为0,结果才为0,有1个为1,结果就为1
问题:如何根据|与运算来改变某一个数x的某一位从0变1,1变1呢?
答:这个时候我们可以对应被改变的数x的位次,引进二进制的所有位次上的值全为0的数y,此时当我们对这两个数进行操作x&y,我们可以计算出结果仍为x,他的值并没有改变,而当我们想改变x的话,我们这时候引进y,让x要改变的某一位对应在y上那一位的数从0变成1,在对x,y进行x&y操作我们马上可以发现对应的值马上变成了我们想要的值
3:异或:^:比对同一位次上的两个数:假如相同为0,不同为1
问题:如何根据|与运算来改变某一个数x的某一位从1变0,0变0呢?
答:这个时候我们可以对应被改变的数x的位次,引进二进制的所有位次上的值全为0的数y,此时当我们对这两个数进行操作x^y,我们可以计算出结果仍为x,他的值并没有改变,而当我们想改变x的话,我们这时候引进y,让x要改变的某一位对应在y上那一位的数从0变成1,在对x,y进行x^y操作我们马上可以发现对应的值马上变成了我们想要的值
基本操作介绍完毕,接下来我们开始介绍位运算的高级操作
1:将最后一位变成1:x|1
思想:由题意可知我们需要将最后一位变成1,由上可知假如我们的基本操作只有与和或,而高级操作这里是根据基本操作来得以实现的,假如我们用与&操作的话我们需要一个二进制全为1的数,然后将其最后一位变成0:假如我们用或|操作的话我们需要一个二进制全为0的数,然后将其最后一位变成1,我们马上发现1就可以实现:所以我们不妨将操作变为 x|1
2:将最后一位变为0:(x|1) - 1
思想:我们在实现最后一位变为1的情况下减去1即实现了最后一位变为0
3:将最后一位取反:x ^ 1
思想:此时我们并不知道是最后一位是0还是1,也不知道要将最后一位变为0还是1,所有此时与&和或|操作都不能进行,此时只有异或操作可能能够帮助我们做到改变,我们只需要改变最后一位:而要改变最后一位我们只需要将上述的0改为1即可,也就是1,这是我们进行x^1操作我们可以知道最后一位之前的数字都不会发生改变,而最后一位假如是1的话,异或1后会变成0,0的话则会变为1,也就实现了取反操作
4:将右数的第k位变成1:x∣(1<<(k−1))
思想:这是我们变化的数的位次由最后一位变为了第k位,那么假如我们用到了与&的话我们需要将y的第k位变为0也就是11011(例子),假如我们用到了或|的话我们我们需要将y的第k位变为1也就是00100(例子)我们可以想到利用1向左移动k-1位即可得到这个例子,比较容易实现,然后我们对x和操作后的y进行或|操作即可将右数的第k位变成1
5:将右数的第k位变成0:x&(~(1<<(k−1)))
思想:思想如上,只不过我们这里用到了与&方法这时我们对上面的y=00100进行取反也就得到了y y = 11011 然后对x和y进行或操作也就得到了将右数的第k位变成0
6:将右数的第k位取反:x∧(1<<(k−1))
思想:这时我们不知道第k位是什么,所有我们得用到异或^,这时我们需要y=00100,由上可知利用1向左移动k-1位即可,此时x∧(1<<(k−1))即可实现将右数的第k位取反
最为经典的几种都上上面,本质操作就是利用基本操作实现高级操作,搞清楚了底层逻辑,其它的也就很容易的可以独立解决了,其他的我就不一一赘述了