八大常见位运算总结(非常经典,建议收藏)

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种:

  1. a ^ 0 = a
  2. a ^ a =0(消消乐)
  3. a ^ b ^ c = a ^ (b ^ c)

前2个无容置疑,就不多说了。下面博主来证明下第3种:

在开头博主已经给出了异或(^)运算的两种记忆方式,下面就是采用第二种方式:无进制相加
由于a,b,c三个数按位与,不管运算顺序如何最终结果无非如下:出现多个1无进制相加,即1两两消除。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Zhenyu_Coder/article/details/135258375