IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 常用位运算简介 -> 正文阅读

[数据结构与算法]常用位运算简介

注:在写题解的时候想查一下位运算的用法,突然发现自己没有位运算的pdf文件,于是就把上次讲课的PPT的内容重新整理了一下(本篇内容结合了网上诸多大佬对于位运算的介绍,在这里对各位大佬表示感谢)

位运算

C++的几种常见位运算

一、按位与(a & b):

法则:两者的相同位都为 1,则结果中该位为 1;否则结果中该位为 0

0&0=0,0&1=0,1&0=0,1&1=1

例:12 & 6 = 4

12:1 1 0 0

6:0 1 1 0

——————

4:0 1 0 0

与运算的用途:

(1)清零
如果想将一个单元清零,即使其全部二进制位为
0
*,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数的指定位
比如取数 X=1010 1110 的低4位,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将XY进行按位与运算(X&Y=0000 1110)即可得到X的指定位。
(3)判断奇偶
只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。

二、按位或(a | b):

法则:两者相同位中有一个为 1,则结果中该位为 1;否则结果中该位为 0

0|0=0,0|1=1,1|0=1,1|1=1

例:12 | 6 = 14

12:1 1 0 0

6:0 1 1 0

——————

14:1 1 1 0

或运算的用途:

(1)常用来对一个数据的某些位设置为1
比如将数 X=1010 1110 的低4位设置为1,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将X与Y进行按位或运算(X|Y=1010 1111)即可得到。

三、按位异或( a^ b):

法则:两者相同位的值若不同,则结果中该位为 1;否则结果中该位为 0

0 ^ 0=0,0 ^ 1=1,1^ 0=1,1^1=0

例:12 ^ 6 = 10

12:1 1 0 0

6:0 1 1 0

——————

10:1 0 1 0

异或的几条性质:

1、交换律
2、结合律 (a^ b)^c == a^ (b^c)
3、对于任何数x,都有 x^ x=0,x^0=x
4、自反性: a^ b^ b=a^0=a;

异或运算的用途:

1)翻转指定位
比如将数 X=1010 1110 的低4位进行翻转,只需要另找一个数Y,令Y的低4位为1,其余位为0,即Y=00001111,然后将X与Y进行异或运算(X^Y=1010 0001)即可得到。
2)与0相异或值不变
例如:1010 1110 ^ 0000 0000 = 1010 1110
3)交换两个数
举例void Swap(int &a, int &b){
if (a != b){
a ^= b;
b ^= a;
a ^= b;}}

四、按位取反(~a):

法则:该数中 0的位置变为 1;1 的位置变为 0

取反运算的用途:

1)使一个数的最低位为零
使a的最低位为0,可以表示为:a & ~ 1。~1的值为 1111 1111 1111 1110,再按”与”运算,最低位一定为0。因为” ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

五、按位左移(a<< b):

法则:将该数 a左移 b 位,正数左移后为正数,负数左移后为负数

例:3 << 2 = 12

3:0 0 1 1

12:1 1 0 0

a << b = a × 2b

六、按位右移(a>> b):

法则:将该数 a 右移 b位,正数右移后为正数,负数右移后为负数。不论正负,都下取整

例:13 >> 2 = 3

13:1 1 0 1

3:0 0 1 1

a >> b = a / 2b

七、非 !a:

法则:该数是 0则为 1 ;否则为 0

例:!0 = 1

? !1 = 0

? !2 = 0

八、各种运算符优先级

-,!,~> *,/,% > >>,<< > >,<,>=,<= > ==,!= > & > ^ > | > && > || > 问号表达式 > 赋值语句

九、负数表示(-x = ~x + 1

十、位运算常用技巧

将 x 第 i 位取反:x ^= 1 << i

将 x 第 i 位制成 1:x |= 1 << i

将 x 第 i 位制成 0:x &= -1 ^ 1 << i 或 x &= ~(1 << i)

取 x 对 2 取模的结果:x & 1

取 x 的第 i 位是否为 1:x & 1 << i 或 x >> i & 1

取 x 的最后一位:x & -x

取 x 的绝对值:(x ^ x >> 31) - (x >> 31) (int 型)

判断 x 是否不为 2的整次方幂:x & x – 1

判断 a 是否不等于 b:a != b , a – b , a ^ b

判断 x 是否不等于 ?1:x != -1 , x ^ -1 , x + 1 , ~x

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:14:11  更:2021-10-17 12:14:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:41:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码