第15章穷人时代如何节约内存——位运算•伟大的比尔盖茨在DOS时代曾经有过这样的说法“640K的内存对一般人来说已经足够”,可现在的电脑内存动辄就是1G、2G,且不评判上述那句话的正误,但从日新月异的硬件发展来看,我们就能猜出二三十年前的程序员是如何在内存使用上精打细算的,与之相比,现代程序员好像少了很多烦恼,内存似乎永远用不完,但内存再大,也要精打细算,本章从位运算的角度看一下如何合理节约内存的使用
1什么是位运算•从开始到现在,本书经常出现的一个词是内存单元,即1B,我们说char型占1个内存单元(1B),而short型占2个内存单元(2B)
1B被当成整体来看,但不要忘记有下面的等式成立:•1B=8bits•1个字节有8个位,每个位有0、1两个取值,从这个角度上说,1个字节所能包含的意义似乎比预想的要大的多
1开灯关灯•举例来说,房间里有8盏灯,为了控制每盏灯的亮灭,可以声明8个Byte变量,变量为0代表灯灭,变量非0代表灯亮,这完全行得通,而且看起来很有效率
•能否换种角度思考,能不能只有1个字节的8个位来控制8盏灯
该位为0代表灯灭,该位为1代表灯亮,答案是“可以”,比较两种方法,发现使用位操作的方式有效节省了内存,如所示:15
2改变状态•假设某个时刻,灯1和灯2亮,而其他灯都灭,此时控制字为11000000,想变换下状态,让灯1和灯3亮,其他灯灭,目标控制字为10100000,只要赋值给该单元即可
•问题又来了,如果原来不知道哪几盏灯亮哪几盏灯灭,现在还是想让第3盏灯亮起来,赋值操作看来是行不通了,要如何做呢
•在这个背景下,位运算的概念被提出,即能否只改变控制第3盏灯的那一位的状态
本章的剩余章节将结合开灯关灯这一场景讲述位运算的内容
•总体来说,C语言中的位运算符有以下两类:•位逻辑运算符:&(位“与”)、^(位“异或”)、|(位“或”