最近开始读《深入理解计算机系统》这本书。对于书中提到的从程序员的角度解读计算机系统这一说法非常感兴趣,所以决定好好读一读。从开始接触计算机编程就是站在一个高级语言的层次,虽然对编译原理,操作系统,汇编语言和计算机组成原理都有所了解,但总觉着所有的知识都还停留在书本上,很难把这些东西都梳理到一个系统中。虽然有一些原理上的知识,但对于我来说更喜欢了解一些细节知识以增加我理解深度。希望通过阅读这本书可以增加这方面的理解,更好地理解计算机到底是如何工作的,这样对以后的编程工作也应该是有帮助的吧。

  刚刚看完的是关于位操作的一些内容,在这里做一些记录以备以后回来复习,主要都是一些我认为对于我之后编相关程序时会有提点作用的内容。下面内容中加引号是对原书中一些句子的直接引用。

1.用位向量表示有限集合

  “位向量的一个很有用的应用就表示有限集合”。例如用n个二进制位便可以表示一个n元集合的所有子集。

  读完这一部分,我有两种理解。其一是:将二进制的每一位数据对应于我们要分析的集合中的一个元素,有和没有分别对应于1和0,通过这样的对应关系,最大的好处就是可以枚举那些本来不便于枚举的集合,方法就是将位向量转化为对应的十进制数。

  对于位向量我的另一个理解是,因为n位二进制可以表示2^n个数,所以,如果将这2^n个数映射到一组元素,也就实现了n位二进制数对集合元素的映射。和上面那种的区别在于,上面的那种是一位对应一个元素,而现在是一个向量对应于一个元素。之所以会这么想是因为想到了之前看过的一道面试题。大概内容是现在有8瓶药水,其中有一瓶是有毒的,现在要用小白鼠做实验检查哪一瓶有毒,问最少需要几只小老鼠。

  这个问题的答案是:3只 。方法是准备三个空杯子标记为0,1,2,将8瓶药水按序号转化为二进制后,对应位为一,则在对应序号的杯子中假如这种药水。最后将这三杯药水分别给三只小白鼠喝下,根据小老鼠的反应,通过二进制找到对应的水杯。例如对于第三瓶药水,二进制为’011‘,则在第0,1两个杯子中加入药水。如果这瓶药水是有毒的,则喝下0,1两杯药水的小白鼠会出现反应。最终通过将小白鼠对应于二进制向量,可以得到对应的有毒的药水的序号。这个问题我觉着就是典型的将二进制向量与集合元素相对应的问题。对于类似的问题,应该算是一个启发。另外如果推广一下也可以将有三个状态的事物对应于三进制位等等等等。

  原书中还提到了对于位向量对应有限集合的问题,“布尔运算|和&分别对应于集合的并和交”。在计算机系统中对这个知识也有广泛的应用,其中之一就是掩码,通过二进制掩码可以实现对一些位数据的屏蔽,比如我们非常熟悉的网络中的子网掩码。

2.通过异或实现元素的交换

  在实现两元素交换值这一问题上,异或无疑是很好的方式,最大的好处就是不需要申请辅助空间,可以实现原地交换。实现代码如下(原书代码):

1 void inplace_swap(int *x, int *y)
2 {
3   *x = *x ^ *y;
4   *y = *x ^ *y;
5   *x = *x ^ *y;
6 }

  这里写这个是希望记下两点,一是“对于任意向量a,有a^a=0”。正是因为有这个特性,才有了上面的结果。

  另一个需要记下的是下面这样一个问题。在原书中有这样一个例子:利用上面的inplace_swap函数,我们可以实现一个数组中的元素头尾两端依次对调的函数(原书代码如下):

1 void reverse_array(int a[], int cnt)
2 {
3     int first,last;
4     for(first = 0, last = cnt-1; first<=last; first++,last--)
5     {
6         inplace_swap(&a[first], &a[last]); 7  } 8 }

  刚看到代码并没有看出任何问题,这是非常简单的一段代码。但是如果我们执行他并给a数组赋值{1,2,3,4,5},我们得到的答案将是{5,4,0,2,1}。我们简单分析一下就能知道会得到这样的结果的原因是在first==last是,我们传递给inplace_swap函数传递的两个参数指向了同一片地址空间(注意不是值相等,而是地址相同),这样在执行(*x = *x ^ *y)这行代码时,由于地址相同,*x和*y同时变为0,这样后面两次操作不管怎么弄,都不会等于其他的了。这也就告诉我们一个需要注意的点:在使用异或操作实现变量交换时,不能出现交换同一地址上值的情况。当然啦,要解决上面这个问题很简单,只要将for循环的条件改为(first<last)就行了。

转载于:https://www.cnblogs.com/akb48/p/4807597.html

《深入理解计算机系统》读书随笔-位操作相关推荐

  1. 深入理解计算机系统读书笔记(第二章 信息的表示和处理)

    这里写自定义目录标题 第二章 信息的表示和处理 2.1 信息存储 2.1.1 十六进制表示法 2.1.2 字数据大小 2.1.3 寻址和字节顺序 2.1.4 表示字符串 2.1.5 代码表示 2.1. ...

  2. 深入理解计算机系统读书笔记

    由于这本书的前半部分习题大多是相关计算和简单汇编代码编写,所以当时都是在稿纸上练习的,不过现在那些稿纸似乎也不见了: ( 所以现在仅有后半部分的课后习题代码以及示例练习代码(家里作业习题当时并没有做, ...

  3. 深入理解计算机系统----读书笔记

    第二部分    信息的表示和处理 信息存储: 二进制(0101001), 八进制,十六进制(0x32FD) 字(word size)指明整数和指针数据的标称大小(normal size),对于w位的机 ...

  4. 深入理解计算机系统(第二版)读书笔记

    八月初开始接触<深入理解计算机系统>这本书,当时看的是英文版,花了一个月的时间大体上过了一遍,但我知道其实还是有很多没看懂的地方,于是借了一本中文版,如今总算可以说我真正看过了这本书,可以 ...

  5. 《深入理解计算机系统》第七章读书笔记

    <深入理解计算机系统>第七章读书笔记 第七章:连接 连接 1.连接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程.这个文件可被加载或拷贝到存储器并执行. 2.连接可以执行于编译 ...

  6. 《深入理解计算机系统》读书笔记

    <深入理解计算机系统>读书笔记 注:<深入理解计算机系统>是我们<系统级编程>课程的参考书.这里主要记载的是在看<深入理解计算机系统>这本书的过程中,遇 ...

  7. 《深入理解计算机系统》读书笔记-016(第 12 章 并发编程)

    <深入理解计算机系统>读书笔记-016(第 12 章 并发编程) 太惨了,这章真心不大看得懂啊--等把前面的补上之后把读书笔记重新整理一下吧.这样看了跟没看也没啥区别了. 在线程中,不同于 ...

  8. 【《深入理解计算机系统》读书笔记(3)】 第3章 程序的机器级表示

    [时间]2021.11.19 [题目]<深入理解计算机系统>读书笔记(3)  第3章 程序的机器级表示 目录 一.简介 二.一些重点图 1.常见数据类型格式 2.16个整数寄存器 3.寄存 ...

  9. 《深入理解计算机系统》读书札记(第一章)

    <深入理解计算机系统>读书札记(第一章) 原书网盘链接地址:https://pan.baidu.com/s/1kF1Q9TloZzzgXewv7atWBw 提取码:gtt1 第一章 计算机 ...

最新文章

  1. 中国联想和浪潮最能算,雄霸全球超算TOP 500数量榜单
  2. odoo tree视图 当页不弹窗显示方法
  3. 第二阶段冲刺10天 第一天
  4. PYPL 二月榜单发布:最受欢迎的编程语言、IDE 和数据库都是哪些
  5. 过度扩容 A股“虚胖”
  6. java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)
  7. java第一天上班需要安装那些_明天第一天上班,应该带什么包啊
  8. 阿里前端开源的一些产品
  9. 在d3中使用2D.js获取图形间的交点
  10. 解决Cannot load /usr/local/apache/modules/libphp5.so的方法
  11. 网桥(Bridge)作用详解
  12. 代理模式和装饰模式的区别
  13. 一文吃透等额本息及其应用
  14. 风险偏好情绪有所改善,非美低位反弹
  15. edg击败we视频_edg击败we视频_LPL夏季赛:EDG零封V5获三连胜 OMG2-1击败WE
  16. 心跳之旅—iOS用手机摄像头检测心率(PPG)
  17. 聊聊生日悖论和生日攻击
  18. python 梦幻西游脚本_python京东抢购脚本打包版下载-京东抢购茅台Python打包版1.0.0简易版下载_骑士下载...
  19. 使用VMware虚拟机安装Red Hat Enterprise Linux8/9教程
  20. [算法学习]模拟退火算法(SA)、遗传算法(GA)、布谷鸟算法(CS)、人工蜂群算法(ABC)学习笔记---附MATLAB注释代码

热门文章

  1. eclipse 中断言使用的设定
  2. SLAM学习,小白入门到殿堂级大牛资料整理
  3. 【C++】algorithm具体操作记录
  4. Hadoop简要介绍
  5. 分解例题及解析_【高考物理】考前梳理,高中物理经典常考例题(带解析),收藏起来考试不低于90+!...
  6. php mysql execute语法_PHP PDOStatement::execute讲解
  7. python导入matplotlib出错_解决导入matplotlib的RuntimeError: Python is not installed as a framework....
  8. php 静态类内存,php面向对象中static静态属性与方法的内存位置分析
  9. zabbix 安装_zabbix系列(五) Grafana4.6.3+Zabbix 的安装部署
  10. miui通知栏要点两下_MIUI免费主题分享,半透明通知栏很好看,另附壁纸!