- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
位运算及其对程序的优化
常州市第一中学 戴涵俊
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位整数,现在要求对这个文件进行排x and not(1 shl (k-1)) 右数第k位取反 x xor (1 shl (k-1)) 去掉右起第一个1的左边 x and (x xor (x-1)) 树状数组中用到的低位技术 求x和y的平均值下取整 x and y+(x xor y) shr 1 避免x+y超界但结果不超界的情况 求x的相反数(x基类型为有符整型
文档评论(0)