华中科技大学计算机系统基础实验报告Word格式文档下载.docx
《华中科技大学计算机系统基础实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《华中科技大学计算机系统基础实验报告Word格式文档下载.docx(32页珍藏版)》请在冰豆网上搜索。
实验总结 30
30
数据表示
1.1实验概述
本实验的目的是更好地熟悉和掌握计算机中整数和浮点数的二进制编码表示。
实验中,你需要解开一系列编程“难题”——使用有限类型和数量的运算操作实现一组给定功能的函数,在此过程中你将加深对数据二进制编码表示的了解。
实验语言:
c;
实验环境:
linux
1.2实验内容
需要完成bits.c中下列函数功能,具体分为三大类:
位操作、补码运算和浮点数操作。
1.3实验设计
源码如下:
/*
*lsbZero-set0totheleastsignificantbitofx
*Example:
lsbZero(0x87654321)=0x87654320
*Legalops:
!
~&
^|+<
<
>
>
*Maxops:
5
*Rating:
1
*/
intlsbZero(intx){
//x右移一位再左移一位实现把最低有效位置0
x=x>
1;
x=x<
returnx;
}
*byteNot-bit-inversiontobytenfromwordx
*Bytesnumberedfrom0(LSB)to3(MSB)
*Examples:
getByteNot(0x12345678,1)=0x1234A978
6
2
intbyteNot(intx,intn){
//x第n个字节每位都和1异或实现取反
inty=0xff;
n=n<
3;
y=y<
n;
x=(x^y);
*byteXor-comparethenthbyteofxandy,ifitissame,return0,ifnot,return1
*example:
byteXor(0x12345678,0x87654321,1)=1
* byteXor(0x12345678,0x87344321,2)=0
20
2
intbyteXor(intx,inty,intn){
//把x和y的第n个字节取出来异或,再转换为逻辑的0和1
y=y>
x=x&
(0xff);
y=y&
return!
!
(x^y);
*logicalAnd-x&
&
y
3
intlogicalAnd(intx,inty){
//把x和y分别转化为逻辑的0和1,再相与
x=(!
(!
x))&
y));
*logicalOr-x||y
intlogicalOr(intx,inty){
//把x和y分别转化为逻辑的0和1,再相或
x))|(!
*rotateLeft-Rotatextotheleftbyn
*Canassumethat0<
=n<
=31
rotateLeft(0x87654321,4)=0x76543218
25
introtateLeft(intx,intn){
//先构造低n位为1,高(32-n)位为0的数z,x左移n位后的数加上x右移(32-n)位的数&
z即可
intz;
z=~(((1<
31)>
31)<
n);
x=((x>
(32+(~n+1)))&
z)+(x<
/*
*parityCheck-returns1ifxcontainsanoddnumberof1'
s
parityCheck(5)=0,parityCheck(7)=1
4
intparityCheck(intx){
//每次将数的低半数位与高半数位比较,再把y右移31位,最后把y转化为逻辑的0和1
inty;
y=x<
16;
y=y^x;
y=y^(y<
8);
4);
2);
1);
31;
y);
*mul2OK-Determineifcancompute2*xwithoutoverflow
mul2OK(0x30000000)=1
*mul2OK(0x40000000)=0
*
intmul2OK(intx){
//把x第31位和30位分别和1做按位与,再异或,再和1异或
intm;
m=((x>
31)&
0x1)^((x>
30)&
0x1);
returnm^0x1;
*mult3div2-multipliesby3/2roundingtoward0,
*ShouldexactlyduplicateeffectofCexpression(x*3/2),
*includingoverflowbehavior.
mult3div2(11)=16
*mult3div2(-9)=-13
*mult3div2(1073741824)=-536870912(overflow)
12
intmult3div2(intx){
//左移一位再+x即x*3,右移一位的时候,当y的最高位和最低位都为0时还要+1
inty=(x<
1)+x;
y=(y>
1)+(((y>
1)&
(((y<
1));
returny;
*subOK-Determineifcancomputex-ywithoutoverflow
subOK(0x80000000,0x80000000)=1,
*subOK(0x80000000,0x70000000)=0,
3
intsubOK(intx,inty){
//x的最高有效位和y的最高有效位不同且x和(x-y)的最高位不同才能判断溢出
intm=(x>
intn=(y>
x=(m^n)&
(m^(((x+(~y+1))>
return(!
x);
*absVal-absolutevalueofx
absVal(-1)=1.
*Youmayassume-TMax<
=x<
=TMax
10
intabsVal(intx){
//x最高位为0时就是x,最高位为1时是~x+1
inty=x>
x=(y&
(~x+1))+((~y)&
*float_abs-Returnbit-levelequivalentofabsolutevalueofffor
*floatingpointargumentf.
*Boththeargumentandresultarepassedasunsignedint'
s,but
*theyaretobeinterpretedasthebit-levelrepresentationsof
*single-precisionfloatingpointvalues.
*WhenargumentisNaN,returnargument..
Anyinteger/unsignedoperationsincl.||,&
.alsoif,while
unsignedfloat_abs(unsigneduf){
intx=uf&
(~(1<
31));
if(x>
0x7f800000)
{
returnuf;
}
elsereturnx;
*float_f2i-Returnbit-levelequi