- 1、本文档共117页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
位运算及其应用
QA
Q:你是谁,我怎么没听说过?
A:即将退役的酱油选手一枚,你们不认识也很正常
Q:既然你这么弱,为什么还要来讲课?
A:我受买老师的命令来基础知识。显然买老师不屑于来讲NOIp难度的东西。
QA
Q:位运算什么的我十年前就会了!
A:鉴于本节课内容十分简单,您可以选择在这里睡觉或者回宾馆睡觉,要是因为这样一节水课影响了您的休息就不好了。祝您进队。
结构
基本运算
二进制位的修改和查询
将整数用作集合
其他应用
例题
约定
约定二进制最高位为最左边,最低位为最右边,最低位标号为第0位
程序均以C++语言描述,所涉及的语言细节、内建函数等均以GNU C++(GCC编译器)为标准
汇编指x86汇编
基本运算
与、或、非和异或
逻辑运算
与、或、非和异或
位运算
逻辑运算在整数上的扩展
结果的每个二进制位等于运算数的对应二进制位进行相应逻辑运算的结果
带符号整数符号位?
一视同仁
交换律、结合律(与、或、异或)
移位运算
逻辑移位
算数移位
循环移位
带进位循环移位四种
逻辑移位
逻辑左移
shl x y
把x的每个二进制位向左移动y位,移动造成的最右边的空位由0补足,最左边的数溢出。
逻辑右移
shr x y
把x的每个二进制位向右移动y位,移动造成的最左边的空位由0补足,最右边的数溢出。
算术移位
算术左移
sal x y
与逻辑左移完全相同
算术右移
sar x y
与逻辑右移大体相同,唯一的区别在于移动造成的最左边的空位由符号位(最高位)补足而不是由0补足。
循环移位
循环左移
rol x y
把x的每个二进制位向左移动y位,移动造成的最右边的空位由最左边溢出的位补足。
循环右移
ror x y
把x 的每个二进制位向右移动y位,移动造成的最左边的空位由最右边溢出的位补足。
带进位循环移位
不搞汇编就别管这个了^_^
注意事项
数学意义
C/C++中的移位运算
无符号整数的移位使用逻辑移位,有符号整数的移位使用算术移位。
无论是无符号整数还是带符号整数,我们都可以放心的使用左移和右移来代替乘以二的幂或除以二的幂的操作。
没有专门的对带符号整数进行逻辑右移的运算符
我们可以通过强制类型转换将它转换成无符号整数后再进行运算。
C/C++中的移位运算
没有提供循环移位操作符
通过其他运算的组合来实现
应用于32位整数的两个例子:
(x y) | (x (32 - y))
(x y) | (x (32 - y))
Pascal?
shl、shr对应逻辑左移、右移
似乎没有算术移位运算符
二进制位的修改和查询
在二进制位的层面上对整数进行一些修改和查询
汇编指令、内建函数以及基本位运算的组合
所介绍的不一定是最优实现,但易于理解和扩展
读某些位
读某些位
读某些位
与运算
通过将原数和一个遮罩进行与运算,可以达到保留指定一些位(将遮罩的对应位设为1),清零其它位(遮罩的对应位设为0)的目的。
改某些位
“与”、“或”和“异或”运算的应用
将某些位置为1
构造遮罩
对于要改为1的位,我们将遮罩的对应位设为1,否则将对应位设为0
原数与遮罩进行或运算
将某些位置为0
构造遮罩
对于要修改的位,我们将遮罩的对应位设为0,否则将其设为1
原数与遮罩进行与运算
将某些位置取反
构造遮罩
如果我们要取反某位,则将遮罩的对应位设为1,否则将其设为0
原数与遮罩进行异或运算
求1的个数
转化为求二进制各位和
分治
每次将整个数分成两个部分,分别求出每个部分的和,再将它们相加
利用位运算,并行完成每一层的工作
求1的个数
求1的个数
第一步,有32个项需要相加,每一项占1 bit
将其中的奇数项和偶数项分别取出来,并将奇数项右移1位和偶数项“对齐”,然后将他们相加
作用:16对1 bit的项分别相加,并将结果存放在了原来这两项所在的2 bit空间上。
第二步,有16个项需要相加,每一项占2 bit。我们将奇偶项分别相加,形成8个4 bit的项。
……
求1的个数
继续优化
求1的个数
第一个区别
Why?
x = ((x 0xAAAAAAAAu) 1) + (x 0);
↓
x-= ((x 0xAAAAAAAAu) 1);
求1的个数
x = (x 0xAAAAAAAAu) + (x 0)
ans = ((x 0xAAAAAAAAu) 1) + (x 0)
两者作差
x - ans = ((x 0xAAAAAAAAu) 1)
ans = x - ((x 0xAAAAAAAAu) 1)
求1的个数
第二个区别
作用:将4对4 bit整数相加
每个整数最大只可能是4,两个数相加的结果也能在4 bit的空间存下
(x 4)
您可能关注的文档
- 《新陈代谢的基本类型》教案和反思.doc
- 《智能运输系统》第3节智能运输系统体系结构.ppt
- 《周易》时位观及中华人格.pdf
- 【Android开发API】更好的策略 - 支持平板与手机 - Supporting Tablets and Handsets.pdf
- 【Android开发API】应用组成部分-绑定服务.pdf
- 【Android开发API】应用组成部分-创建一个内容提供器.pdf
- 【Android开发Wiki】进阶篇同步到云-Syncing to the Cloud(二):使用备份API—Using the Backup API.pdf
- 【FreeRTOS操作系统教程】第7节 FreeRTOSConfig配置文件详解.pdf
- 【IMS6.0 C01】(胶片)SPG2800结构原理和配置.ppt
- 【RTX操作系统教程】第17节 定时器组.pdf
文档评论(0)