八大常见位运算总结(非常经典,建议收藏)
- 1 基础位运算
- 2 确定一个数(x)的二进制第x位是1还是0
- 3 将一个数(num)二进制的第n位修改成1
- 4、将一个数(num)二进制的第n位修改成0
- 5、 位图思想
- 6、 提取一个数(num)二进制表示中最右边的1(lowbit)
- 7、 删除一个数(num)二进制表示中最右边的1
- 8、异或(^)运算的运算律
1 基础位运算
基础位运算有下面6中:>>
、<<
、~
、&
、|
、^
。
如果有不清楚的,可以查看操作符详解。下面给出后3个运算符记忆方式。
&(按位与)
,有0就为0|(按位或)
,有1就为1^(按位异或)
,相同为0,相异为1;或无进制相加
2 确定一个数(x)的二进制第x位是1还是0
我们可以将x的二进制位向右移动x-1位(即将需确定的第x位挪到尾处),在和1按位于即可。
下面例子博主故意把数字给的较小,这意味这高位字节均为0,没有意义。因此只给出二进制的部分,后续都如此。
3 将一个数(num)二进制的第n位修改成1
我们给出的办法是将1左移n位,在和num按位或。(即num | (1<<n))
【解读】:1<<n,出现一个数(第n位为1,其他所有位为0);在和num按位或,则最终结果的第x位为1,其他位不变。
例子:
4、将一个数(num)二进制的第n位修改成0
我们可以将1左移n位,在将得到的结果按位取反,最后按位与上num即可(即num & ~(1<<x))
【解读】:1<<n我们知道二进制除第x位为1,其他位全为0;在按位取反,则二进制的第x位为0,其他位均为1;在和num按位与,则二进制的第x位修改位0,其他位不变。
例子:
5、 位图思想
位图就是上述3种位运算多次使用,本质还是一样。就不多说了
6、 提取一个数(num)二进制表示中最右边的1(lowbit)
我们可以将先取-num, 在和num按位于即可(即num & (-num))
【解读】:这里博主提醒下,要得到一个数的负数,可以先将这个数按位取反在加1(即-num = ~(num)+1)。这样我们可以知道-num二进制和num相比,-num将最右边1的左边所有二进制数全部变成相反,左边二进制数全为0。最后在按位与上num即可得到最右边的1。
例子:
7、 删除一个数(num)二进制表示中最右边的1
我们可以先将num-1,在和num按位与即可(即num & (num-1))
【解读】:我们知道num-1得到的二进制与num区别在于:数(num)二进制中最右边的1的左边二进制数全部相反(包括1本身),由边全相等。最后在按位与即可。
例子:
8、异或(^)运算的运算律
异或(^)运算的运算律主要是以下3种:
- a ^ 0 = a
- a ^ a =0(消消乐)
- a ^ b ^ c = a ^ (b ^ c)
前2个无容置疑,就不多说了。下面博主来证明下第3种:
在开头博主已经给出了异或(^)运算的两种记忆方式,下面就是采用第二种方式:
无进制相加
。由于a,b,c三个数按位与,不管运算顺序如何最终结果无非如下:出现多个1无进制相加,即1两两消除。