计算机系统基础lab1,lab1

一、实验目的:

1更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。

2.实验中使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中加深对数据二进制编码表示的了解

3. 熟悉linux基本操作命令,其中常用工具和程序开发环境

4.完善bits.c的各个函数,实现其功能,并通过.btest的测试

二、实验要求

1. 尽快熟悉linux基本操作命令,还有其中常用工具和程序开发环境

2. 除浮点数函数实现外,只能使用顺序程序结构,禁用if, do,

while, for, switch等。

[if !supportLists]n [endif]有限操作类型,!~  &  ^ |  +  <>  各函数不一样

[if !supportLists]n [endif]禁用(!=、==、&&、|| 等组合操作符)

[if !supportLists]n [endif]常量值范围   0~255

[if !supportLists]n [endif]禁用强制类型转换

[if !supportLists]n [endif]禁用整型外的任何其它数据类型

[if !supportLists]n [endif]禁用定义和宏

[if !supportLists]n [endif]不得使用函数

[if !supportLists]n [endif]具体要求可参看bits.c各函数框架的注释

[if !supportLists]n [endif]可以使用循环和条件控制;

[if !supportLists]n [endif]可以使用整型和无符号整型常量及变量(取值不受[0,255]限制);

[if !supportLists]n [endif]不使用任何浮点数据类型、操作及常量。

[if !supportLists]n [endif]可以使用int和unsigned两种整型数据

[if !supportLists]n [endif]禁用浮点数据类型、struct、union或数组结构。

[if !supportLists]n [endif]浮点数函数均使用unsigned型数据表示浮点数据。

[if !supportLists]n [endif]float_abs等函数必须能处理全范围的变量值,包括(NaN)和infinity。

三、实验内容(所修改函数代码,功能以及重要代码的解释):

主要操作内容:位操作函数;  补码运算函数;    浮点数表示函数

例:

/*

功能:将整形x最后一位置零

*/

/*

*  lsbZero - set 0 to the least significant bit of x

*  Example: lsbZero(0x87654321) = 0x87654320

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 5

*  Rating: 1

*/

int lsbZero(int x) {

return x>>1<<1; //通过先向右移一位将最低位舍弃,再向左移动,最低位补零

}

/*

功能:把第n(0~3)个字节取反

取反:1)~  2)^111

*/

/*

* byteNot - bit-inversion to byte n from wordx

*  Bytes numbered from 0 (LSB) to 3 (MSB)

*  Examples: getByteNot(0x12345678,1) = 0x1234A978

*   Legalops: ! ~ & ^ | + << >>

*   Maxops: 6

*  Rating: 2

*/

int byteNot(int x, int n){

//让原本的数与第n个字节的位为1,其他位都为0的数取^

intm=(n<<3);//n*8

int a=0xff<

return x^a;

}

/*

功能:比较x,y的第n个字节,相同输出0,不同输出1

*/

*   byteXor - compare the nth byte of x and y,if it is same, return 0, if not, return 1

*  example: byteXor(0x12345678, 0x87654321, 1) = 1

*                   byteXor(0x12345678, 0x87344321, 2) = 0

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 2

*/

int byteXor(int x, int y,int n) {

x=x>>(n<<3)&0xff;//把第n位字节移到最左边,其他化为0

y=y>>(n<<3)&0xff;

return !!(x^y);//比较两个数

}

/*

功能:实现逻辑与

*/

/*

*  logicalAnd - x && y

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 3

*/

int logicalAnd(int x, inty) {

x=!!x;//把数字为0的化成0,其他化为1

y=!!y;

return (x&y);

}

/*

功能:实现逻辑或

*/

/*

*  logicalOr - x || y

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 3

*/

int logicalOr(int x, inty) {

x=!!x;//把数字为0的化成0,其他化为1

y=!!y;

return x|y;

}

/*

功能:把数字的前n位移到最后面

*/

/*

* rotateLeft - Rotate x to the left by n

*   Canassume that 0 <= n <= 31

*  Examples: rotateLeft(0x87654321,4) = 0x76543218

*  Legal ops: ~ & ^ | + << >> !

*   Maxops: 25

*  Rating: 3

*/

int rotateLeft(int x, intn) {

//把前n位取下来移到最右边+(x向左移n位)

int y=32+(~n+1);//y=32-n

int z=x&((~0)<

z=(z>>y)&((1<

x=(x<

return x;

}

/*

功能:判断输入数含有的1的个数是否为奇数,是输出1

*/

/*

* parityCheck - returns 1 if x contains an oddnumber of 1's

*  Examples: parityCheck(5) = 0, parityCheck(7) = 1

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 4

*/

int parityCheck(int x) {

//把高16位右移16位,和低16位进行按位异或运算,这样就会消掉偶数个数的1;以此类推

x=(x>>16)^x;

x=(x>>8)^x;

x=(x>>4)^x;

x=(x>>2)^x;

x=(x>>1)^x;

return (x&1);

}

/*

功能:x*2,不溢出来

*/

/*

* mul2OK - Determine if can compute 2*xwithout overflow

*  Examples: mul2OK(0x30000000) = 1

*            mul2OK(0x40000000) = 0

*

*  Legal ops: ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 2

*/

int mul2OK(int x) {

//发现只要前两位不同就会溢出

int y=3<<30;//11000…

x=y&x;

int a=(x>>30)^1;//把前面第二个数取出来

int b=(x>>31);// 把前面第一个数取出来

return (a^b);

}

/*

功能:算出输入数*3/2 ,结果与c语言相同

*/

/*

* mult3div2 - multiplies by 3/2 roundingtoward 0,

*  Should exactly duplicate effect of C expression (x*3/2),

*  including overflow behavior.

*  Examples: mult3div2(11) = 16

*            mult3div2(-9) = -13

*            mult3div2(1073741824) = -536870912(overflow)

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 12

*  Rating: 2

*/

int mult3div2(int x) {

x=(x<<1)+x;//x*3

x+=(x>>31)&1;//加上一个偏移量(2^1-1)

x=(x>>1);//右移一位

return x;

}

/*

功能:判断x-y会不会溢出

*/

/*

* subOK - Determine if can compute x-y withoutoverflow

*  Example: subOK(0x80000000,0x80000000) = 1,

*           subOK(0x80000000,0x70000000) = 0,

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 20

*  Rating: 3

*/

int subOK(int x, int y) {

//只要x与y,x-y的符号位不同时就会溢出。(-++负减正得正,+--)

intz=x+(~y)+1;

int i=(1<<31);

z=z&i;

x=x&i;

y=y&i;

return !((x^y)&(x^z));

}

/*

功能:输入数的绝对值

*/

/*

* absVal - absolute value of x

*  Example: absVal(-1) = 1.

*   Youmay assume -TMax <= x <= TMax

*  Legal ops: ! ~ & ^ | + << >>

*   Maxops: 10

*  Rating: 4

*/

int absVal(int x) {

//如果这个数是负数,负数的二进制取反加一就是绝对值

int a=(x>>31);

x=(x^a)+!!a;

return x;

}

/*

功能:返回输入数的绝对值,如果是nan就返回原值

*/

/*

* float_abs - Return bit-level equivalent ofabsolute value of f for

*  floating point argument f.

*   Boththe argument and result are passed as unsigned int's, but

*   theyare to be interpreted as the bit-level representations of

*  single-precision floating point values.

*   Whenargument is NaN, return argument..

*  Legal ops: Any integer/unsigned operations incl. ||, &&. alsoif, while

*   Maxops: 10

*  Rating: 2

*/

unsignedfloat_abs(unsigned uf) {

int x=uf&0x7fffffff;//除去符号位

if(x>0x7f800000)//nan的定义,阶码都为1,尾数不为0

return uf;

else

return x;

}

/*

功能:将unsigned转为int型 ,当uf位NAN或越界时返回0x80000000

*/

/*

* float_f2i - Return bit-level equivalent ofexpression (int) f

*   forfloating point argument f.

*   Argumentis passed as unsigned int, but

*   itis to be interpreted as the bit-level representation of a

*  single-precision floating point value.

*  Anything out of range (including NaN and infinity) should return

*  0x80000000u.

*  Legal ops: Any integer/unsigned operations incl. ||, &&. alsoif, while

*   Maxops: 30

*  Rating: 4

*/

intfloat_f2i(unsigned uf) {

int x = ((uf & 0x7f800000) >> 23) -127;//阶码

int y = (uf & 0x007fffff) ^0x00800000;//尾数

if (x > 31 || ((uf & 0x7fffffff) >0x7f800000))

return 0x80000000;

if (x < 0)

return 0;

int b = (uf >> 31) & 1;//符号位

if (b & 0x1)//负数

{

if (x > 23)

return ~(y << (x - 23)) + 1;

else

return ~(y >> (23 - x)) + 1;

}

else

{

if (x > 23)

return (y << (x - 23));

else

return (y >> (23 - x));

}

}

四、实验结果(在虚拟机中,进行语法检查,编译,正确性检查的截图):

[if !vml]

[endif]

五、实验总结

通过这次实验,我对计算机底层的数据运算和处理有了一些了解。实践与理论相结合,明白了书上讲的一些内容,以及学会了一些linux的操作命令,更加深入理解了计算机系统基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值