计算机系统基础 - 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相关推荐

  1. 在线教学生计算机,计算机系统基础—廖浩德老师—在线教学的先行者

    为响应学校关于"延期不延教.停课不停学"的号召,学院教学部门提前部署,统筹安排前4周有课的任课老师提前做好在线教学准备,软件工程教研室廖浩德老师则是在线教学的探路者.先行者之一. ...

  2. 计算机AL教程笔记,计算机系统基础学习笔记(2)-数据的位运算操作

    C语言的位运算操作包括两类,逻辑运算操作和逻辑移位操作. 逻辑运算操作 C语言提供了四种按位逻辑操作符,分别是按位取反,按位与,按位或,按位异或.在编译时,编译器会根据操作数的宽度分别转换为不同的指令 ...

  3. 计算机系统基础 南京大学,计算机系统基础(一):程序的表示、转换与链接

    本课程是"计算机系统基础"系列课程中的第一门,主要介绍高级语言程序中的数据类型及其运算.语句和过程调用等是如何在计算机系统中实现的.主要包含三个主题:(1)表示.不同数据类型(如带 ...

  4. 计算机系统基础期中考试,计算机系统基础第二次作业.docx

    文档介绍: 计算机系统基础第二次作业3.对于以下AT&T格式汇编指令,根据操作数的长度确定对应指令助记符中的长度后缀,并说明每个操作数的寻址方式.(1)mov8(%ebp,%ebx,4),%a ...

  5. 华中科技大学计算机系统基础实验3报告,华中科技大学计算机系统基础实验报告.doc...

    文档介绍: 课程实验报告课程名称:计算机系统基础专业班级:学号:姓名:指导教师:报告日期:2016年5月24日计算机科学与技术学院目录实验1: 2实验2: 9实验3: 22实验总结 30 实验1:数据 ...

  6. 学习资料收集:计算机系统基础

    [1] 计算机系统基础.复旦大学 http://ics.fudan.edu.cn/jpkc/main.html 这本书为教材 (其中有些PPT课件可供下载) [2] 转载于:https://www.c ...

  7. 冯·诺依曼结构及其主要思想【计算机系统基础01】

    冯·诺依曼结构,让每一位学习计算机系统基础的学生印象深刻,因为它是现代计算机的基础,是计算机系统知识架构中所绕不开的重要组成部分.计算机系统基础的学习,也从冯诺依曼结构开始. 世界上第一台通用电子计算 ...

  8. 【计算机系统基础4】程序的机器级表示

    [计算机系统基础4]程序的机器级表示 4.程序的机器级表示 4.1(:school: CMU补充 )x86-64 Linux 寄存器使用 4.2传送指令 4.2.1`mov` 指令 4.2.2 `mo ...

  9. 计算机系统基础书籍读后感,计算机系统基础试题.doc

    文档介绍: 第一部分计算机系统基础一.选择题[1]计算机最主要的工作特点是 A)高速度B)高精度C)存记忆能力★D)存储程序与自动控制[2]目前微型计算机中采用的逻辑元件是 A)小规模集成电路 B)中 ...

最新文章

  1. putty如何安装mysql_使用Linux 安装MySQL
  2. RabbitMQ 七战 Kafka,差异立现!
  3. P1135 奇怪的电梯(BFS/DFS)
  4. 1!+2!+3!+…+10!的和
  5. nacos配置刷新失败导致的cpu上升和频繁重启,nacos配置中心源码解析
  6. android 代码 lut,Android BitmapFactory.decodeResource()错误或用于加载大LUT的替代选项...
  7. 大数据处理黑科技:揭秘PB级数仓GaussDB(DWS) 并行计算技术
  8. Linux 命令(94)—— env 命令
  9. Nginx源码分析 - 初探Nginx的架构(01)
  10. 大华服务器如何修改IP,大华摄像头更改IP地址
  11. Unity url编码转换
  12. 偶滴神嘞~终于弹钢琴了
  13. typora激活方法及使用教程
  14. 如何对List去重,含Java8写法
  15. Lanbda表达式 java8新特性
  16. 级联rc滤波_六阶级联式开关电容低通滤波器设计与仿真分析
  17. 华为计算机网络认证软件,华为认证入门计算机网络基础
  18. 二代旅游CMS网站管理系统使用手册(二)--目的地管理
  19. LMS151-10100单线激光雷达与RealSense双目相机的联合标定
  20. C 语言 rand() 和 srand() 使用方法

热门文章

  1. 记一次Windows勒索病毒应急响应实战
  2. 三个分数、大球吃小球、五子棋
  3. 常用的c语言,C语言常用.docx
  4. 光声断层成像的傅里叶变换图像重建算法
  5. Revit中如何连接消火栓-Revit中快速连接设备
  6. django 上传 缩略图_使用django-thumbnail-works生成图像缩略图。
  7. Python实现Catboost分类模型(CatBoostClassifier算法)项目实战
  8. 【LeetCode Python实现】908. 最小差值 I(简单)
  9. CTF-攻防世界web新手入门篇
  10. 漫鸽爬虫实例 - 采集信用中国的数据