- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PAGE
PAGE 6
位运算及其对程序的优化
常州市第一中学 戴涵俊
JSOI2009省队论文
目 录
序言 ………………………………………………………………………… 3
正文 ………………………………………………………………………… 4
一、位运算的基本操作 ………………………………………………… 4
1.位运算介绍
2.位运算的优先级
3.位运算的口诀
二、位运算的实用技巧 ………………………………………………… 5
1.对于mod运算的优化
2.位运算的一些技术
三、位运算对一些数据结构的优化 …………………………………… 6
1.循环队列
2.树状数组
3.集合
4.哈希表
四、位运算对一些算法的优化 ………………………………………… 12
1.状态压缩动态规划
2.搜索
五、总结 ………………………………………………………………… 15
六、附录 ………………………………………………………………… 15
七、参考资料 …………………………………………………………… 24
序 言
程序中所有的数据在计算机内存中都是以二进制的形式储存的。位运算,本质上就是直接对整数在内存中的二进制位进行运算,同时,数的各个二进制位互不影响。由于位运算直接对内存数据进行操作,不需要转换成十进制,因此处理速度非常快,在信息学竞赛中往往可以优化理论时间复杂度的系数。另外,位运算还有很多特殊的技巧,能够帮助我们简化代码、美化程序等等。本文就结合自己的学习和应用经验,介绍一些位运算及其对程序的优化方法。
正 文
位运算的基本操作
1. 位运算介绍
① and
X
Y
X and Y
0
0
0
1
0
0
0
1
0
1
1
1
通过上表不难发现,只有当x和y都为1时and后值才为1。and运算主要是用来取出某个二进制位。例如:A and (1 shl 5)就是取出A的二进制数从右往左第6位。
② or
X
Y
X and Y
0
0
0
1
0
1
0
1
1
1
1
1
or运算通常用来强行给二进制的某一位赋值,注意or运算可能导致变量越界,对于有符号类型,or可能把符号位取反,无符号类型可能直接就变成0了,这有可能会导致数据的丢失,使得程序崩溃。因此,执行or运算,应该尽量保证变量不超界,或者更保险地,是非负数。
xor
X
Y
X and Y
0
0
0
1
0
1
0
1
1
1
1
0
当两个位不同时得到1,否则为0。因此xor通常可以用来取反。有意思的是xor的逆运算是其本身。于是,我想起了一道做过的有点诡异的题目:给你n个数,n大到只保证你读入不超时,其中仅有一个数出现了奇数次,要你找出这个数。方法是只要通过读一个xor一个,出现偶数次的肯定抵消了,剩下来的就是那个数了。
not
X
not(X)
0
1
1
0
not操作就是直接把内存中的0和1全部取反。对于有符号类型,符号位也会取反,这是需要注意的,比如x=2147483647,x:longint; not(x)就得到了-2147483648,即011111……1是表示maxlongint,100000……0是表示的-maxlongint-1。
shl
左移,就是把二进制数整体向左移动x个位,并且右数x个单位是0;如果移出界,那么移出部分就丢失了,而不会runtime error。对于有符号类型,移位当然会移到符号位上去,比如x=2^30,x:longint;那么x shl 1就得到-2147483648;
shr
右移,就是把二进制数整体向右移动x个位,原来的最高x个位就变为0;shr相当于div 2。
2. 位运算的优先级
not and , shl ,shr or,xor
比如下面的几个运算:
not 1 or 1 = -1
not 1 and 1 = 0
1 and 1 shl 1 = 2
not 1 or 0 shl 1 xor 0 and 1 = -2
虽然掌握各个运算符的优先级并不困难,但是为了避免出错,增强程序的可读性,利于调试,我们还是在需要的地方添加括号来保证优先运算。
3. 位运算的口诀
清零取反要用与,某位置一可用或。
若要取反和交换,轻轻松松用异或。
4. 举例
例1、一个文件中有9亿个不重复的9位整数,现在要求对这个文件进行排序(当然时间可以不止1秒,但要求出可行解)。
[问题分析]
拿到题目也许会吓一跳,这么多数,就是想快排存也存不下啊。线性时间的排序算法—桶排序?貌似是这样,但是9位数,这么大
您可能关注的文档
最近下载
- 企业吸收合并协议.doc VIP
- 板框压滤机操作规程.doc VIP
- 义务教育版七年级全一册信息科技 第9课 数据传输有新意 教案(表格式).pdf VIP
- 爬山虎的脚PPT课件.pptx
- 康复辅助技术咨询师.pdf VIP
- 北京工业大学822信号与系统2022年真题及答案.pdf VIP
- 全国黄金交易从业水平考试《黄金市场基础知识与交易实务》复习全书【核心讲义+章节练习】.docx VIP
- 电饭煲UL认证零部件检验要求.pdf VIP
- 浙江省桐乡市2025年上半年公开招聘辅警试题含答案分析.docx VIP
- GB30871危险化学品企业位特殊作业安全规范知识考试复习题库(含答案).docx VIP
文档评论(0)