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

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

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

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


相关文章
|
3月前
|
NoSQL 容器 消息中间件
实战技巧位运算
实战技巧位运算
|
5月前
|
存储 算法 搜索推荐
[C语言数据结构]万字长文带你学习八大排序
[C语言数据结构]万字长文带你学习八大排序
|
8月前
|
算法 Java 编译器
第 14 天_位运算【算法入门】
第 14 天_位运算【算法入门】
80 0
|
10月前
|
算法 C++
【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算
【C++算法图解专栏】一篇文章带你掌握高精度加减乘除运算
98 0
|
10月前
|
机器学习/深度学习 算法
【经典八大排序】(1)
一 .直接插入排序 直接插入排序是从一段数据中将一个数据在合适的位置插入。
|
10月前
|
存储 算法 搜索推荐
【经典八大排序】(2)
一 .直接插入排序 直接插入排序是从一段数据中将一个数据在合适的位置插入。
|
11月前
|
算法 C++ Python
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
【每日算法Day 66】经典面试题:不用四则运算如何做加法?
|
11月前
|
算法 Python
如何用简单的位操作实现高级算法
如何用简单的位操作实现高级算法
66 0
|
11月前
|
算法 C语言 索引
基础算法-位运算
1. 位运算符简介 位运算符主要作用于位,是逐位进行操作。最常用的有:与 &、或 |、异或 ^。 常见的位运算符有(假设变量 A = 60,变量 B =13):
|
算法
2022/4/8回顾算法入门第一章位运算的回顾。
2022/4/8回顾算法入门第一章位运算的回顾。
92 0