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

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

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

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两两消除。


相关文章
|
7月前
|
NoSQL 容器 消息中间件
实战技巧位运算
实战技巧位运算
|
6月前
|
存储 自然语言处理 算法
位运算入门及简单算法题的应用
位运算入门及简单算法题的应用
49 1
|
7月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
6月前
|
C语言
C语言中求x的n次方:从入门到实践(保姆式教学)
C语言中求x的n次方:从入门到实践(保姆式教学)
483 0
|
机器学习/深度学习 算法
【经典八大排序】(1)
一 .直接插入排序 直接插入排序是从一段数据中将一个数据在合适的位置插入。
|
存储 算法 搜索推荐
【经典八大排序】(2)
一 .直接插入排序 直接插入排序是从一段数据中将一个数据在合适的位置插入。
|
算法 C++ Python
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
130 0
|
算法 Python
如何用简单的位操作实现高级算法
如何用简单的位操作实现高级算法
102 0
|
编译器
【C位运算&基础+面试题】位运算中阶详解及面试题(上)
【C位运算&基础+面试题】位运算中阶详解及面试题
86 0
【C位运算&基础+面试题】位运算中阶详解及面试题(上)
|
机器学习/深度学习
【C位运算&基础+面试题】位运算中阶详解及面试题(下)
【C位运算&基础+面试题】位运算中阶详解及面试题
84 0
【C位运算&基础+面试题】位运算中阶详解及面试题(下)