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

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

  • 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,没有意义。因此只给出二进制的部分,后续都如此。


八大常见位运算总结(非常经典,建议收藏)_第1张图片


3 将一个数(num)二进制的第n位修改成1

我们给出的办法是将1左移n位,在和num按位或。(即num | (1<

【解读】:1< 例子:
八大常见位运算总结(非常经典,建议收藏)_第2张图片

4、将一个数(num)二进制的第n位修改成0

我们可以将1左移n位,在将得到的结果按位取反,最后按位与上num即可(即num & ~(1<

【解读】:1< 例子:
八大常见位运算总结(非常经典,建议收藏)_第3张图片

5、 位图思想

位图就是上述3种位运算多次使用,本质还是一样。就不多说了

6、 提取一个数(num)二进制表示中最右边的1(lowbit)

我们可以将先取-num, 在和num按位于即可(即num & (-num)

【解读】:这里博主提醒下,要得到一个数的负数,可以先将这个数按位取反在加1(即-num = ~(num)+1)。这样我们可以知道-num二进制和num相比,-num将最右边1的左边所有二进制数全部变成相反,左边二进制数全为0。最后在按位与上num即可得到最右边的1。
例子:

八大常见位运算总结(非常经典,建议收藏)_第4张图片

7、 删除一个数(num)二进制表示中最右边的1

我们可以先将num-1,在和num按位与即可(即num & (num-1)

【解读】:我们知道num-1得到的二进制与num区别在于:数(num)二进制中最右边的1的左边二进制数全部相反(包括1本身),由边全相等。最后在按位与即可。
例子:

八大常见位运算总结(非常经典,建议收藏)_第5张图片

8、异或(^)运算的运算律

异或(^)运算的运算律主要是以下3种:

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

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

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

八大常见位运算总结(非常经典,建议收藏)_第6张图片

你可能感兴趣的:(算法指南,位运算,算法,学习,笔记)