当前位置: 首页 > 编程日记 > 正文

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

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

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

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

相关文章:

专访小邪:从十年技术之路看阿里技术体系的变革

2019独角兽企业重金招聘Python工程师标准>>> 摘要&#xff1a; 从2008年到2018年&#xff0c;从阿里巴巴中间件团队到飞天八部——小邪与阿里的十年。 编者按&#xff1a;从2008年到2018年&#xff0c;从阿里巴巴中间件团队到飞天八部——小邪与阿里的十年。 2008年…

PHP SPL笔记

PHP SPL笔记作者&#xff1a; 阮一峰日期&#xff1a; 2008年7月 8日这几天&#xff0c;我在学习PHP语言中的SPL。这个东西应该属于PHP中的高级内容&#xff0c;看上去很复杂&#xff0c;但是非常有用&#xff0c;所以我做了长篇笔记。不然记不住&#xff0c;以后要用的时候&am…

算力超越 iPhone,芯片堪比Mac,网友:“买来能干啥?”

整理 | 郑丽媛出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自去年“元宇宙”概念突然爆火&#xff0c;作为其“入门钥匙”的 AR/VR 设备也顺势成为了话题焦点&#xff0c;尤其在多家外媒爆料苹果也在为此发力、甚至从 Meta 挖人以争取在 2022 年正式推出时&…

ios开发日记- 5 屏幕截图

-(void)fullScreenshots{UIWindow *screenWindow [[UIApplication sharedApplication] keyWindow]; UIGraphicsBeginImageContext(screenWindow.frame.size);//全屏截图&#xff0c;包括window [screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage …

MaxCompute助力OSS支持EB级计算力

一、 MaxCompute是什么&#xff1f; 你的OSS数据是否作堆积在一旁沉睡已久&#xff0c;存储成本变为企业负担&#xff1f;你是否想唤醒沉睡的数据&#xff0c;驱动你的业务前行&#xff1f;MaxCompute可以帮助你高效且低成本的解决这些问题&#xff0c;通过对海量数据进行分析和…

php自动加载

很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件。一个很大的烦恼是不得不在每个脚本&#xff08;每个类一个文件&#xff09;开头写一个长长的包含文件列表。 在 PHP 5 中&#xff0c;不再需要这样了。可以定义一个 __autoload 函数&#xff0c;它会在试…

22个案例详解 Pandas 数据分析/预处理时的实用技巧,超简单

作者 | 俊欣来源 | 关于数据分析与可视化今天小编打算来讲一讲数据分析方面的内容&#xff0c;整理和总结一下Pandas在数据预处理和数据分析方面的硬核干货&#xff0c;我们大致会说Pandas计算交叉列表Pandas将字符串与数值转化成时间类型Pandas将字符串转化成数值类型Pandas当…

《mysql性能调优与架构设计》笔记: 一mysql 架构组成

2019独角兽企业重金招聘Python工程师标准>>> 2.1mysql物理文件组成 2.1.1日志文件&#xff1a; 1&#xff0c;查看mysql配置文件&#xff1a;mysql --verbose --help | grep -A 1 Default options; 1&#xff0c;错误日志&#xff1a;--log-error[file_name] 指定错…

发现一个可以搜索常用rpm包的地址(http://www.rpmfind.net/)

http://www.rpmfind.net/ 虽然资源不多&#xff0c;但也够用。 >如有问题&#xff0c;请联系我&#xff1a;easonjim#163.com&#xff0c;或者下方发表评论。<

PHP版UTF-8文件BOM自动检测移除程序

BOM信息是文件开头的一串隐藏的字符&#xff0c;用于让某些编辑器识别这是个UTF-8编码的文件。但PHP在读取文件时会把这些字符读出&#xff0c;从而形成了文件 开头含有一些无法识别的字符的问题。比如用UTF-8格式保存的生成图片的PHP文件&#xff0c;因为文件头隐藏的BOM信息也…

java: web应用中不经意的内存泄露

前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑&#xff0c;今天无意发现如果使用不当&#xff0c;很容易引起内存泄露&#xff0c;测试代码如下&#xff1a; 1、定义一个类App package com.cnblogs.yjmyzz.web.controller;import java.util.Date;public class…

「游戏圈地震级消息」687亿美元,微软收购游戏巨头动视暴雪

整理 | 苏宓、禾木木 出品 | CSDN 2022年1月18日晚&#xff0c;一条热搜刷爆了朋友圈&#xff1a; 继 2018 年&#xff0c;微软以 75 亿美元收购全球知名的代码托管平台 GitHub 后&#xff0c;2022 年 1 月 18 日&#xff0c;微软将以 687 亿美元的价格收购著名游戏制作和发行公…

java实现用户登录注册功能(用集合框架来实现)

需求&#xff1a;实现用户登录注册功能(用集合框架来实现) 分析&#xff1a; A:需求的类和接口 1.用户类 UserBean 2.用户操作方法接口和实现类 UserDao UserDaoImpl 3.测试类 UserTest B:各个类中的东西 1.用户类UserBean: …

第3次翻译了 Pandas 官方文档,叒写了这一份R万字肝货操作!

作者 | 黄伟呢来源 | 数据分析与统计学之美今天&#xff0c;我继续为大家讲述Pandas如何实现R语言的相关操作。由于 Pandas 旨在提供人们使用 R 进行的大量数据操作和分析功能&#xff0c;因此本页开始提供更详细的 R 语言及其与 Pandas 相关的许多第三方库的介绍。与 R 和 CRA…

PHP autoload机制详解

PHP autoload机制详解 转载自 jeakcccPHP autoload机制详解(1) autoload机制概述在使用PHP的OO模式开发系统时&#xff0c;通常大家习惯上将每个类的实现都存放在一个单独的文件里&#xff0c;这样会很容易实现对类进行复用&#xff0c;同时将来维护时也很便利。这 也是OO设计…

有关博客的一些断想

作者&#xff1a;朱金灿来源&#xff1a;http://blog.csdn.net/clever101随着微博、微信等短平快社交媒体的兴起&#xff0c;文字相对严肃的博客毫无疑问受到很大的冲击。我在想博客会不会因此而消亡呢。我相信不会&#xff0c;因为喜欢轻快的文字固然是人类的天性&#xff0c;…

pythonl学习笔记——爬虫的基本常识

1 robots协议 Robots协议&#xff08;也称为爬虫协议、机器人协议等&#xff09;的全称是“网络爬虫排除标准”&#xff08;Robots Exclusion Protocol&#xff09;&#xff0c;网站通过Robots协议告诉搜索引擎哪些页面可以抓取&#xff0c;哪些页面不能抓取。 如&#xff1a; …

hibernate相关收集

2019独角兽企业重金招聘Python工程师标准>>> 1、Hibernate SQL方言 如果出现如下错误&#xff0c;则可能是Hibernate SQL方言 (hibernate.dialect)设置不正确。 Caused by: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]last_ins…

盘一盘 2021 年程序员们喜欢的网站数据

作者 | 周萝卜来源 | 萝卜大杂烩世界上流量最大的网站有哪些&#xff0c;也许我们都能脱口而出&#xff0c;比如 Google&#xff0c;YouTube&#xff0c;Facebook 还有 PxxnHub 等等&#xff0c;今天我们就通过多个维度来看看&#xff0c;那些叱咤全球的流量网站&#xff01;数…

烽火18台系列之十一:刚需中的刚需——网站篡改监控

网站篡改事件近些年来越演越烈&#xff0c;其中包括政府、教育、金融、事业企业单位等。根据国家互联网应急响应中心发布的《2015年中国互联网网络安全报告》中指出&#xff0c;“2015年CNCERT/CC工检测到境内被篡改的网站数量为24550个&#xff0c;其中境内政府网站篡改数量为…

Http与RPC通信协议的比较

OSI网络结构的七层模型 各层的具体描述如下&#xff1a;第七层&#xff1a;应用层 定义了用于在网络中进行通信和数据传输的接口 - 用户程式&#xff1b;提供标准服务&#xff0c;比如虚拟终端、文件以及任务的传输 和处理&#xff1b; 第六层&#xff1a;表示层 掩…

基于 Python 和 OpenCV 构建智能停车系统

作者 | 努比来源 | 小白学视觉当今时代最令人头疼的事情就是找不到停车位&#xff0c;尤其是找20分钟还没有找到停车位。根据复杂性和效率的不同&#xff0c;任何问题都具有一个或多个解决方案。目前智能停车系统的解决方案&#xff0c;主要包括基于深度学习实现&#xff0c;以…

js获取鼠标位置

1.PageX/PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化2.clientX/clientY:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化. 可是悲剧的是,PageX只有FF…

Lua保留指定小数位数

默认会四舍五入 比如&#xff1a;%0.2f 会四舍五入后&#xff0c;保留小数点后2位print(string.format("%.1f",0.26)) ---会输出0.3&#xff0c;而不是0.2 Lua保留一位小数 --- nNum 源数字 --- n 小数位数 function Tool. GetPreciseDecimal(nNum, n)if type(nNum)…

htaccess文件用法收集整理

1.时区设置有些时候&#xff0c;当你在PHP里使用date或mktime函数时&#xff0c;由于时区的不同&#xff0c;它会显示出一些很奇怪的信息。下面是解决这个问题的方法之一。就是设置你的服务器的时区。你可以在这里找到所有支持的时区的清单。 1.SetEnv TZ Australia/Melbourne …

手把手教你使用 YOLOV5 训练目标检测模型

作者 | 肆十二来源 | CSDN博客这次要使用YOLOV5来训练一个口罩检测模型&#xff0c;比较契合当下的疫情&#xff0c;并且目标检测涉及到的知识点也比较多。先来看看我们要实现的效果&#xff0c;我们将会通过数据来训练一个口罩检测的模型&#xff0c;并用pyqt5进行封装&#x…

数据仓库数据模型之:极限存储--历史拉链表

摘要: 在数据仓库的数据模型设计过程中&#xff0c;经常会遇到文内所提到的这样的需求。而历史拉链表&#xff0c;既能满足对历史数据的需求&#xff0c;又能很大程度的节省存储资源。在数据仓库的数据模型设计过程中&#xff0c;经常会遇到这样的需求&#xff1a;1. 数据量比较…

super的用法(带了解)

super的用法&#xff08;带了解&#xff09; super的用法&#xff08;带了解&#xff09;posted on 2018-05-11 21:31 leolaosao 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/leolaosao/p/9026686.html

Posted content type isn't multipart/form-data

版权声明&#xff1a;欢迎转载&#xff0c;请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/48712507 在有文件上传的表单提交过程中&#xff0c;搞不好就会报Posted content type isnt multipart/form-data的错误。 解决办法 <form class"form-…

CSDN 十大技术主题盘点-AI篇

关于2021&#xff0c;我们能看到的技术变化有很多。当云原生向下而生&#xff0c;当分布式数据库席卷而至&#xff0c;当低代码平台扩展了开发的边界&#xff0c;当万物互联蔚然成风……我们看到了太多在2021年形成的变化&#xff0c;但也能看到这些趋势非但没有结束&#xff0…