计算机系统基础 - Lab1
计算机系统基础 - Lab1
要求:
1.运用虚拟机在Linux 32位系统下完成实验
2.每个函数功能在限定的操作符下完成
lsbZero
- lsbZero - set 0 to the least significant bit of x
- 最低位设0
int lsbZero(int x) {return (x>>1)<<1;
}
byteNot
- byteNot - bit-inversion to byte n from word x
- 获取指定字节
int byteNot(int x, int n) {n=n<<3;int m=0xff;m=m<<n;return m^x;
}
由于一个字节为八位,n需先乘上3(n<<3)
byteXor
- byteXor - compare the nth byte of x and y, if it is same, return 0, if not, return 1
- 比较指定字节
int byteXor(int x, int y, int n) {int m=0xff;n=n<<3;m=m<<n;x=x&m;y=y&m;return !!(x^y);
}
由于一个字节为八位,n需先乘上3(n<<3)
logicalAnd
- logicalAnd - x && y
合取
int logicalAnd(int x, int y) {x=!(!x);y=!(!y);return x&y;
}
- 两次取反将值转化为0-1形式
logicalOr
- logicalOr - x || y
- 析取
int logicalOr(int x, int y) {x=!(!x);y=!(!y);return x|y;
}
rotateLeft
- rotateLeft - Rotate x to the left by n
int rotateLeft(int x, int n) {int m=0xffffffff;m=~(m<<n);int k=x<<n;x=x>>(32+(~n+1));x=x&m;return k+x;
}
parityCheck
- parityCheck - returns 1 if x contains an odd number of 1’s
int parityCheck(int x) {x=x^(x<<16);x=x^(x<<8);x=x^(x<<4);x=x^(x<<2);x=x^(x<<1);x=x>>31;return !(!x);
}
方法的巧妙在于
每次将数前后分成两组
然后将这两组进行异或运算(^)如 1001 和 1010 (1001^1010)
得到0011发现任意两组运算时都会消去偶数个 “ 1 ”
而得到的最后一组若为零则说明前面以每次消除偶数个的方式
消除了所有的 “ 1 ”,说明原数中有偶数个 “ 1 ”
反之为奇数个
mul2OK
- mul2OK - Determine if can compute 2*x without overflow
- 判断乘二是否溢出
int mul2OK(int x) {return (((x>>31)&0x1)^((x>>30)&0x1))^0x1;
}
讨论两种情况分别正数和负数
无论是哪种情况当第31位和第30位不同时,乘二即左移都会改变符号位,产生溢出
mult3div2
- mult3div2 - multiplies by 3/2 rounding toward 0,
int mult3div2(int x) {x=x+(x<<1);x=(x>>1)+(((x>>31)&0x1)&(((x<<31)>>31)&0x1));return x;
}
乘3可以转化为 (x<<1)+x
重点是负数在除2的时候
由于负数是补码的形式
如果一个负数最低位为1(如-3这种情况)
我们都知道 -3/2=-1
而 -3(0xfffffffd)右移1位的结果为 -2(0xfffffffe)
可推理出这种情况应加上1
subOK
- subOK - Determine if can compute x-y without overflow
- 判断x-y是否溢出
int subOK(int x, int y) {int z=x+(~y+1);x=x>>31;x=x&0x1;y=y>>31;y=y&0x1;z=z>>31;z=z&0x1;return !((x^y)&(x^z));
}
先算出z
我们知道x-y等于x加上y的补码(~y+1)
判断依据为 x , y , z 符号位
(1)符号位相等时,一定不溢出
(2)符号位不同时,结果z与x符号不同才溢出
absval
- absVal - absolute value of x
- 求绝对值
int absVal(int x) {int y=(x>>31);return (y&(~x+1))+((~y)&x);
}
float_abs
- float_abs - Return bit-level equivalent of absolute value of f for
- 求单精度浮点数绝对值
unsigned float_abs(unsigned uf) {int m = uf&0x7fffffff;if(m>0x7f800000)return uf;elsereturn m;
}
熟记IEEE754单精度浮点数表示这道题应该不难
将浮点数最高位设置为0再赋值给m,即可得到一个整数(不一定)
还需考虑NaN,sNaN情况
即符号位为1,阶码全1,尾数非零情况
我们将该数原封不动返回
floeat_f2i
float_f2i - Return bit-level equivalent of expression (int) f
float to int
int float_f2i(unsigned uf) {int x,y;unsigned m = 0x80000000;x=(uf>>23)&0xff;//取阶码y=(uf&0x007fffff)^0x00800000;//将尾数与隐藏的1结合形成一个1xxxxxxxxx....if(x>158){return m;//若阶码大于31(158-127),超出int数据范围}if(x<127){return 0;//阶码<0(-127<0)说明这是一个0.xxxx..的数,转化为int为0}//范围内的数可以开工//150为127+23,阶码大于它说明小数点可以左移,否则右移//y最高位默认为0(0x00800000),因为我们过滤了下>158的情况//所以在左移过程中不会有溢出的情况(符号位改变),所以如果为负数则将所有位取反再+1即为所求else if(((uf>>31)&0x1)==1){if(x>150)return ((~(y<<(x-150)))+1);elsereturn ((~(y>>(150-x)))+1);}else{if(x>150)return (y<<(x-150));elsereturn (y>>(150-x));}
}
考察IEEE754标准
步骤:
1.取出阶码, 尾数
2.讨论x>158和x<127情况
3.将阶码与尾数结合形成int类型数,若为负数则取反加1
计算机系统基础 - Lab1相关推荐
- 在线教学生计算机,计算机系统基础—廖浩德老师—在线教学的先行者
为响应学校关于"延期不延教.停课不停学"的号召,学院教学部门提前部署,统筹安排前4周有课的任课老师提前做好在线教学准备,软件工程教研室廖浩德老师则是在线教学的探路者.先行者之一. ...
- 计算机AL教程笔记,计算机系统基础学习笔记(2)-数据的位运算操作
C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作. 逻辑运算操作 C语言提供了四种按位逻辑操作符,分别是按位取反,按位与,按位或,按位异或.在编译时,编译器会根据操作数的宽度分别转换为不同的指令 ...
- 计算机系统基础 南京大学,计算机系统基础(一):程序的表示、转换与链接
本课程是"计算机系统基础"系列课程中的第一门,主要介绍高级语言程序中的数据类型及其运算.语句和过程调用等是如何在计算机系统中实现的.主要包含三个主题:(1)表示.不同数据类型(如带 ...
- 计算机系统基础期中考试,计算机系统基础第二次作业.docx
文档介绍: 计算机系统基础第二次作业3.对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻址方式.(1)mov8(%ebp,%ebx,4),%a ...
- 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...
文档介绍: 课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24日计算机科学与技术学院目录实验1: 2实验2: 9实验3: 22实验总结 30 实验1:数据 ...
- 学习资料收集:计算机系统基础
[1] 计算机系统基础.复旦大学 http://ics.fudan.edu.cn/jpkc/main.html 这本书为教材 (其中有些PPT课件可供下载) [2] 转载于:https://www.c ...
- 冯·诺依曼结构及其主要思想【计算机系统基础01】
冯·诺依曼结构,让每一位学习计算机系统基础的学生印象深刻,因为它是现代计算机的基础,是计算机系统知识架构中所绕不开的重要组成部分.计算机系统基础的学习,也从冯诺依曼结构开始. 世界上第一台通用电子计算 ...
- 【计算机系统基础4】程序的机器级表示
[计算机系统基础4]程序的机器级表示 4.程序的机器级表示 4.1(:school: CMU补充 )x86-64 Linux 寄存器使用 4.2传送指令 4.2.1`mov` 指令 4.2.2 `mo ...
- 计算机系统基础书籍读后感,计算机系统基础试题.doc
文档介绍: 第一部分计算机系统基础一.选择题[1]计算机最主要的工作特点是 A)高速度B)高精度C)存记忆能力★D)存储程序与自动控制[2]目前微型计算机中采用的逻辑元件是 A)小规模集成电路 B)中 ...
最新文章
- putty如何安装mysql_使用Linux 安装MySQL
- RabbitMQ 七战 Kafka,差异立现!
- P1135 奇怪的电梯(BFS/DFS)
- 1!+2!+3!+…+10!的和
- nacos配置刷新失败导致的cpu上升和频繁重启,nacos配置中心源码解析
- android 代码 lut,Android BitmapFactory.decodeResource()错误或用于加载大LUT的替代选项...
- 大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
- Linux 命令(94)—— env 命令
- Nginx源码分析 - 初探Nginx的架构(01)
- 大华服务器如何修改IP,大华摄像头更改IP地址
- Unity url编码转换
- 偶滴神嘞~终于弹钢琴了
- typora激活方法及使用教程
- 如何对List去重,含Java8写法
- Lanbda表达式 java8新特性
- 级联rc滤波_六阶级联式开关电容低通滤波器设计与仿真分析
- 华为计算机网络认证软件,华为认证入门计算机网络基础
- 二代旅游CMS网站管理系统使用手册(二)--目的地管理
- LMS151-10100单线激光雷达与RealSense双目相机的联合标定
- C 语言 rand() 和 srand() 使用方法
热门文章
- 记一次Windows勒索病毒应急响应实战
- 三个分数、大球吃小球、五子棋
- 常用的c语言,C语言常用.docx
- 光声断层成像的傅里叶变换图像重建算法
- Revit中如何连接消火栓-Revit中快速连接设备
- django 上传 缩略图_使用django-thumbnail-works生成图像缩略图。
- Python实现Catboost分类模型(CatBoostClassifier算法)项目实战
- 【LeetCode Python实现】908. 最小差值 I(简单)
- CTF-攻防世界web新手入门篇
- 漫鸽爬虫实例 - 采集信用中国的数据