CSAPP笔记 第一章第二章
目录
第一章
一个典型的硬件组成
从键盘上读取hello指令编辑
存储器结构示例
相对性能公式
计算机系统抽象
第二章--信息的表示和处理
按位 & | ^ ~ 与逻辑运算 && ||
逻辑右移和算术右移 左移
定义计算机如何编码和操作整数的数学定义
补码编码的定义
补码转换为无符号数
无符号数转补码
无符号数的零扩展 和 补码的符号扩展
截断无符号数 截断补码
无符号加法
检测是否发生了溢出
无符号数取反
补码加法
检测补码加法中的溢出
补码的非
补码乘法
与2的幂相乘的无符号乘法
除以2的幂的无符号除法
除以2的幂的补码除法,向下舍入
改进:向上舍入
浮点数
***************** 0.1-x的二进制表示(已解决)
IEEE浮点数表示法
规格化的值和非规格化的值和特殊值
数字示例
四种舍入方式
阿贝尔群
但是浮点加法不支持结合律
csapp lab
第4关:bitCount
第5关:bang
实验七
实验八
实验10:
实验11
实验12
三个浮点数实验
第一章
一个典型的硬件组成
从键盘上读取hello指令
存储器结构示例
相对性能公式
计算机系统抽象
第二章--信息的表示和处理
按位 & | ^ ~ 与逻辑运算 && ||
逻辑右移和算术右移 左移
对有符号的基本上是算术右移,无符号为逻辑右移
定义计算机如何编码和操作整数的数学定义
补码编码的定义
补码转换为无符号数
无符号数转补码
当一个运算中既有无符号数和有符号数会将有符号数强制转换为无符号数并且默认为非负数进行运算,在< >运算中这种操作经常导致错误
无符号数的零扩展 和 补码的符号扩展
当补码是负数的时候扩展就是往前面补1也就是补f
截断无符号数 截断补码
截断补码要关注第一位的0 1区别
无符号加法
检测是否发生了溢出
无符号数取反
补码加法
因为有符号与无符号使用的是一样的位级表示,所及可以先将补码转换成无符号数进行加法之后再换成补码
检测补码加法中的溢出
示例
补码的非
执行位级补码的非有一种办法:对该补码每一位取反后加一,也就是取补后加一
补码乘法
无符号乘法和补码的乘法位级表达是一样的
与2的幂相乘的无符号乘法
除以2的幂的无符号除法
除以2的幂的补码除法,向下舍入
改进:向上舍入
代码:
浮点数
***************** 0.1-x的二进制表示(已解决)
0.1 - x是指误差,不是什么奇怪的数字表达式,看懂了
IEEE浮点数表示法
规格化的值和非规格化的值和特殊值
数字示例
浮点数好复杂
四种舍入方式
讲的什么狗咒语
阿贝尔群
阿贝尔群(Abelian Group),又称交换群或加群,是这样一类群:
它由自身的集合 G 和二元运算 * 构成。它除了满足一般的群公理,即运算的结合律、G 有单位元、所有 G 的元素都有逆元之外,还满足交换律公理。因为阿贝尔群的群运算满足交换律和结合律,群元素乘积的值与乘法运算时的次序无关。(离散数学的知识,dddd)
但是浮点加法不支持结合律
csapp lab
lab好难
在头歌平台做的实验,感觉好像和官网有点不一样
Data lab(一)中的4,5,7,8,10,11,12
Data Lab(二)中的全部三个,头大
第4关:bitCount
任务描述
本关任务:补充函数bitCount()
,统计x
的二进制表示中1
的数量,将结果return
返回。
- 操作符使用数量限制:
40
测试说明
平台会对你编写的代码进行测试:
测试输入:5
预期输出:2
int bitCount(int x)
{/********* Begin *********/unsigned int d = x; d = (d&0x55555555)+((d>>1)&0x55555555); d = (d&0x33333333)+((d>>2)&0x33333333); d = (d&0x0F0F0F0F)+((d>>4)&0x0F0F0F0F); d = (d&0x00FF00FF)+((d>>8)&0x00FF00FF); d = (d&0x0000FFFF)+((d>>16)&0x0000FFFF); return d;/********* End *********/
}
第5关:bang
任务描述
本关任务:补充函数bang()
,不使用!
实现!
操作符,将结果return
返回。
- 操作符限制:
~ & ^ | + << >>
- 操作符使用数量限制:
12
测试说明
平台会对你编写的代码进行测试:
测试输入:4
预期输出:0
int bang(int x)
{/********* Begin *********/x = x |(x>>16); x = x |(x>>8); x = x |(x>>4); x = x |(x>>2); x = x | (x>>1); return (~x)&1;/********* End *********/ }
实验七
实现函数int fitsBits(int x, int n),如果x可以只用n位补码表
示则返回1,否则返回0(1<=n<=32)。要求最多使用15个操作符。
实验原理:
一个数如果能左移N位后,在右移N位,仍然等于这个数,表明
这个数可以用N位来表示。
int fitsBits(int x, int n)
{ int s = 32-n; int m = x; m = m<<s; m = m>>s; return !(m^x);
}
实验八
编写函数int divpwr2(int x, int n),计算x除以2的n次方的结
果,结果向零取整。要求最多使用15个操作符。
实验原理:
这道实验题,还是比较麻烦的,正数直接右移就行,但是负数右
移当不能整除时,是向无穷大靠近的;因此负数要加上进一个偏置,
然后再右移,结果才能正确;另外除以2的N次方能整除的条件是,
这个数的最低N位是0,负数要加上的偏置就是使最低N位变成0,
并使第N+1位变成1。具体看实现中的代码以及注释。
int divpwr2(int x, int n)
{ //获取符号位,用来区分正负数 要不要加偏置 //需要注意的是移位是算术移位 如果x是负数,那么s全为1 int s = x >> 31;
//偏置数 低N位全部是位 1 unsigned int c = (1<<n)+(~0); //如果是整数 偏置c被置成0 负数时不改变c的值 c = c&s;
// 结果 return (x+c)>>n;
}
实验10:
编写函数int isPositive(int x),如果x大于0返回1,否则返回
0,使用操作符的数量最大是8个。
实现原理:
大于0的数,是非0正数,因此需要根据符号位确定是正数,还要不
是0。
int isPositive(int x)
{ //确定符号位 int s = x>>31;
//判断是不是0 int r = !(!x);
//!s 正数为1 负数为0 return !s&r;
}
实验11
实验11:
实现函数int isLessOrEqual(int x, int y),如果x小于等于y则
返回1,否则返回0。使用操作数的最大数量是24。
实现原理:
转化成两个问题,如果x,y符号相同,y-x的值是正数,如果x,
y符号不同,那么x是负数。
需要注意,符号相同相减不会发生溢出,符号不同时才有可能发
生溢出,因此单独依靠y-x的正负,不能得到x小于等于y。
int isLessOrEqual(int x, int y)
{ //计算y-x并得到结果的符号位的值 int rsl = y-x; int rs = rsl >>31;
//获取x,y的符号位 int xs = x>>31; int ys = y>>31;
//x,y的符号是否一样,不一样ds 是1,一样ds 是0; int ds = xs^ys;
//(ds&xs) 符号不同 单x是负数 返回1
//符号相同 但结果rs 是正数(!ds&!rs)。返回1 return ((ds&xs)|(!ds&!rs))&1;
}
实验12
实验12:
编写函数int ilog2(int x),求x以2为底的对数的结果(向下取整)。
返回结果,使用操作符的数量最大位90个。
实现原理:
这是实验本质上是求最高位的1的位置,以32位整数为例,先看
最高位1是不是在高16位,可以利用!!(x>>16)表达式来计算,如
果!!(x>>16)是1,表示在高16位,因此暂时将结果设置成c=16;之
后再逐次逼近,计算!!(x>>(8+c))的值,如果结果仍然为1,那么就 将结果暂时设置成c=c+3;最后计算!!(x>>(1+c))的结果,就能得到
最终的答案结果。
int ilog2(int x)
{ int c = 0; c = (!!(x>>16))<<4; c = c+((!!(x>>(8+c)))<<3); c = c+((!!(x>>(4+c)))<<2); c = c+((!!(x>>(2+c)))<<1); c = c+(!!(x>>(1+c))); return c;
}
三个浮点数实验
《深入理解计算机系统》Lab1:Data Lab(二)_float_neg_drizzle2333的博客-CSDN博客
CSAPP笔记 第一章第二章相关推荐
- 《算法帝国》第一章第二章读书笔记
heeeeeeeeeeeeeeeeeeeeello! 好像有半个月都没好好写笔记了,经历了两次面试,一次败在单面,一次败在群面,哈啊-说明还完全有待努力! 稍微研究了一下,这本书好像并不需要什么代码记 ...
- 【吃瓜笔记】第一章第二章
[吃瓜笔记]第一章&第二章 一.基本术语 二.模型评估与选择 1.评估方法 (1).留出法 (2).交叉验证法 (3).自助法 2.选择依据 (1).性能度量 1).错误率与精度 2).查准率 ...
- 【Git】版本控制管理(第二版) 前言 第一章 第二章
版本控制管理 前言 第一章 第二章 资源 前言 本书结构 第一章 介绍 总结在开头 1.1 背景 1.2 Git的诞生 1.3 先例 1.4 时间线 第二章 安装Git 2.1 使用Linux上的二进 ...
- Day1ps设计基础作业第一章第二章
Day1 ps设计基础作业第一章第二章 1.1工作区和工作流程 3种调整人像照片亮度的方式:1图像-调整-亮度/对比度,2图像-调整-色阶,3获取图像亮度+混合模式,通道(右下)按ctrl RGB的缩 ...
- Java 北大青鸟 第一学期 第二章 上机练习
Java 北大青鸟 第一学期 第二章 上机练习 手中牌互换 华氏度摄氏度 银行定期储蓄业务 数据类型 源文件下载 手中牌互换 public static void main(String[] args ...
- 第一篇第二章火灾的基础知识
沿外墙面蔓延的情况 需要注意:层高要足够高 要不下层着火会直接蔓延到上层 喷头系统必须在轰然之前进行灭火 否则灭火失败 2019/1/3 [录播]2018一消精华班-实务-一级消防工程师-环球网校 h ...
- 谈谈在计算机系统中引入操作系统,初中信息技术第一册第二章第1节《操作系统简介》教学设计...
广州市初中信息技术第一册第二章第1节<操作系统简介>教学设计 一.学习者分析 学生通过第一章的学习,对计算机的软.硬件知识有了初步的了解,同时对操作系统的作用也有了简单的认识.但由于学生普 ...
- python从入门到实践学习笔记_Python编程从入门到实践:学习笔记1(第二章)
开通博客我用的理由是:读书学习时记笔记,一方面为了回顾,一方面为了督促自己.fighting! 学习Python,我买了Python编程从入门到实践. 我将从第二章开始记录我认为我以后会忘记以及重要的 ...
- mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...
MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...
最新文章
- SpringBoot b2b2c 多用户商城系统(十五)Springboot整合RabbitMQ...
- 无数优秀投资人的选择——GMQ Group
- 数据表列名与数据库关键字冲突,在Hibernate下的解决办法
- SAP CRM市场营销表结构
- numpy基础(part10)--通用函数
- pyaudio usb playback_苹果安卓手机充电器USB接口PSD源文件psd素材
- Windows server 2003域控直接迁移到2012[史上最详细]
- 在jsp中调用常量类中的属性值
- etcd3 安装与运维
- 《操作系统》学习辅导
- (四)下载利器aria2
- scala case 常用简写
- 原来发朋友圈还有这讲究,难怪我的朋友圈没人看
- ubuntu1804 3dm-gx5-25
- Html 实现手风琴效果
- Linux操作系统学习02
- Linux安装SQuirreL SQL Client
- 学生信息管理系统代码全篇
- java p2p 下载_java p2p文件传输(含服务器端与jsp源码)
- 图片瀑布流加载和购物车
热门文章
- iPhone4S价格走势平稳 现价5999值得买
- 32*4段 超低功耗LCD液晶显示驱动IC-VKL128 LQFP44,适用水表/传感器/热能表/压力表/测厚仪等,工作电流约7.5微安
- 为增强供应链安全,美国将设立“国家供应链完整性之月”
- 深圳铨顺宏圆满落幕IOTE 2022第十八届国际物联网展
- 手机怎么给PDF文件加密?分享一个好用加密工具
- 谁将成为“中国FedEx”?
- 《未来简史》赫拉利:人工智能会成为人类史上重要的革命|2016 TGPC
- java用tkmapper分组查询_tk.mybatis 中的通用Mapper自定义SQL语句
- 二叉树的三种遍历方式(递归、非递归和Morris遍历)
- python io流a+_python io流