第15章 穷人时代如何节约内存——位运算.pptVIP

第15章 穷人时代如何节约内存——位运算.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第15章 穷人时代如何节约内存——位运算

第15章 穷人时代如何节约内存——位运算 伟大的比尔盖茨在DOS时代曾经有过这样的说法“640K的内存对一般人来说已经足够”,可现在的电脑内存动辄就是1G、2G,且不评判上述那句话的正误,但从日新月异的硬件发展来看,我们就能猜出二三十年前的程序员是如何在内存使用上精打细算的,与之相比,现代程序员好像少了很多烦恼,内存似乎永远用不完,但内存再大,也要精打细算,本章从位运算的角度看一下如何合理节约内存的使用。 15.1 什么是位运算 从开始到现在,本书经常出现的一个词是内存单元,即1B,我们说char型占1个内存单元(1B),而short型占2个内存单元(2B)。1B被当成整体来看,但不要忘记有下面的等式成立: 1 B = 8 bits 1个字节有8个位,每个位有0、1两个取值,从这个角度上说,1个字节所能包含的意义似乎比预想的要大的多。 15.1.1 开灯关灯 举例来说,房间里有8盏灯,为了控制每盏灯的亮灭,可以声明8个Byte变量,变量为0代表灯灭,变量非0代表灯亮,这完全行得通,而且看起来很有效率。 能否换种角度思考,能不能只有1个字节的8个位来控制8盏灯?该位为0代表灯灭,该位为1代表灯亮,答案是“可以”,比较两种方法,发现使用位操作的方式有效节省了内存,如所示: 15.1.2 改变状态 假设某个时刻,灯1和灯2亮,而其他灯都灭,此时控制字想变换下状态,让灯1和灯3亮, 其他灯灭,目标控制字只要赋值给该单元即可。 问题又来了,如果原来不知道哪几盏灯亮哪几盏灯灭,现在还是想让第3盏灯亮起来,赋值操作看来是行不通了,要如何做呢? 在这个背景下,位运算的概念被提出,即能否只改变控制第3盏灯的那一位的状态?本章的剩余章节将结合开灯关灯这一场景讲述位运算的内容。 总体来说,C语言中的位运算符有以下两类: 位逻辑运算符:(位“与”)、^(位“异或”)、|(位“或”)、~(位“取反”)。 移位运算符:(左移)、(右移)。 15.2 位逻辑运算符 读者现在对逻辑运算已经不陌生了,位逻辑运算的原理与普通逻辑运算基本一致,不同在于普通的逻辑运算以变量为单位,而位逻辑运算以位(bit)为单位,先从最简单的位取反运算说起。 15.2.1 位取反操作 假设不知道哪几盏灯亮着哪几盏灯灭着,但想进行一个操作:让亮着的灯灭掉,让灭着的灯亮起来,这时就要用到位取反操作。 位取反的操作符为“~”,如果A那么~A返回的结果即每位都取反,0变成1,1变成0,需要注意的是,位取反运算并不改变操作数的值。 假设字节A控制着8盏灯的亮灭,那么下述操作可实现预想的功能: A=~A: 重申,位取反运算并不改变操作数的值,是赋值运算改变了A的值。 15.2.2 位与运算 位与运算的操作符为,将对两个操作数的每一位进行与运算,位“与”运算的准则如下: 1 1=1 1 0=0 0 1=0 0 0=0 不知道哪几盏灯亮着哪几盏灯灭着,想让第3盏灯灭掉,使用位与就能实现,想想看,要如何来做呢? 只要在当前状态的基础上位与即可,和1位与并不会改变原来位的状态,而和0位与,无论原来是0还是1,都会变成0,灯灭。 15.2.3 位或运算 位或运算的操作符为|,将对两个操作数的每一位进行或运算,位“或”运算的准则如下: 1 | 1=1 1 | 0=1 0 | 1=1 0 | 0=0 不知道哪几盏灯亮着哪几盏灯灭着,想让第3盏灯亮起来,使用位或就能实现,只要在当前状态的基础上位或即可,和0位或并不会改变原来位的状态,而和1位或,无论原来是0还是1,都会变成1,灯亮。 15.2.4 位异或 位或运算的操作符为^,将对两个操作数的每一位进行异或运算。通俗地讲,如果位“异或”运算的两个位相同(同为0或同为1),结果为0,若两个位不同(一个为0,另一个为1),结果为1,对应的准则为: 1 ^ 1=0 1 ^ 0=1 0 ^ 1=1 0 ^ 0=0 位“反”、位“与”、位“或”和位“异或”运算符不关心操作数的符号,只是按操作数所在字节的0、1序列进行比对,符号位会被当成普通的0或1进行处理。 15.2.5 实例分析 演示了位取反、位与、位或和位异或几种运算符的用法。 15.3 移位运算 顾名思义,移位运算就是将某个量中的bits向左或向右移动,该量的值也会相应发生变化,在开灯关灯这个场景中,移位运算的一个重要应用是实现流水灯效果,即按从1到8或从8到1的顺序每次只亮一个灯。 15.3.1 基本形式 移位运算表达式的基本形式为: A n; /*左移*/ 或 A n; /*右移*/ A称为

文档评论(0)

cgtk187 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档