【深圳大学计算机系统2】实验二 数据表示实验
1,补码最大值+1为1000…*参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值。对于32位整数来说,最小值是2-31,即为0x 8000 0000,则将1左移31位。*isAsciiDigit - 如果x是ascii码中的0~9,返回1;*参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值。*参数和结果都会被作为unsigned返回,但是会表示为
实验目的与要求
- 了解各种数据类型在计算机中的表示方法
- 掌握C语言数据类型的位级表示及操作
方法、步骤
- 安装gcc-multilib:
或者:
2、根据bits.c中的要求补全以下的函数:
intbitXor(int x, int y);
inttmin(void);
intisTmax(int x);
ntallOddBits(int x);
int negate(int x);
intisAsciiDigit(int x);
int conditional(int x, int y, int z);
intisLessOrEqual(int x, int y);
intlogicalNeg(int x);
inthowManyBits(int x);
unsignedfloat_twice(unsigned uf);
unsigned float_i2f(int x);
int float_f2i(unsigned uf);
3、在Linux下测试以上函数是否正确,指令如下:
*编译:./dlc bits.c
*测试:make btest
./btest
实验过程及内容
1.打开虚拟机,打开输入su后输入apt-get install gcc-multilib成功安装
2.编写函数
(1)bitXor 函数
* 仅允许使用~和&来实现异或
* 例子: bitXor(4, 5) = 1
* 允许的操作符: ~ &
* 最多操作符数目: 14
* 分值: 1
由异或运算的定义和德摩根定律可得
(2)tmin函数
* 返回最小的二进制补码
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 4
* 分值: 1
对于32位整数来说,最小值是2-31,即为0x 8000 0000,则将1左移31位。
(3)isTmax函数
* isTmax - 如果x是最大的二进制补码,返回1;否则,返回0
* 允许的操作符: ! ~ & ^ | +
* 最多操作符数目: 10
* 分值: 2
寻找补码最大值特点,补码最大值为0111…1,补码最大值+1为1000…,两个值每位都是相异的,其异或结果再取反应为;特殊情况当x=0xffffffff时也满足上述条件,故要做特判:x+1应该不为0。
(4)allOddBits函数
* allOddBits - 如果所有奇数位都为1则返回1;否则返回0
* 例子:allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 12
* 分值: 2
(5)negate函数
* negate - 返回-x
* 例子: negate(1) = -1.
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 5
* 分值: 2
(6)isAsciiDigit函数
* isAsciiDigit - 如果x是ascii码中的0~9,返回1;否则返回0
* 例子: isAsciiDigit(0x35) = 1.
* isAsciiDigit(0x3a) = 0.
* isAsciiDigit(0x05) = 0.
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 15
* 分值: 3
(7)conditional函数
* conditional - 实现x?y:z
* 例子: conditional(2,4,5) = 4
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 16
* 分值: 3
(8)isLessOrEqual函数
* isLessOrEqual - 如果x<=y返回1否则返回0
* 例子: isLessOrEqual(4,5) = 1.
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 24
* 分值: 3
(9)logicalNeg函数
* logicalNeg - 实现!运算符的功能
* 例子: logicalNeg(3) = 0, logicalNeg(0) = 1
* 允许的操作符: ~ & ^ | + << >>
* 最多操作符数目: 12
* 分值: 4
(10)howManyBits函数
* howManyBits - 返回将X表示为补码所需的最小有效位数。
* 例子: howManyBits(12) = 5
* howManyBits(298) = 10
* howManyBits(-5) = 4
* howManyBits(0) = 1
* howManyBits(-1) = 1
* howManyBits(0x80000000) = 32
* 允许的操作符: ! ~ & ^ | + << >>
* 最多操作符数目: 90
* 分值: 4
(11)float_twice函数
* float_twice - 以unsinged表示的浮点数二进制的二倍的二进制unsigned型
* 参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值。
* 允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while
* 最多操作符数目: 30
* 分值: 4
(12)float_i2f函数
* float_i2f - 返回int x的unsigned浮点数的二进制形式
* 参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值
* 允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while
* 最多操作符数目: 30
* 分值: 4
(13)float_f2i函数
* float_f2i - 返回unsigned uf的整型数的二进制形式
* 参数和结果都会被作为unsigned返回,但是会表示为二进制的单精度浮点值
* 任何超过范围的数都应该返回 0x80000000u.
* 允许的操作符: 任何整数或者无符号数操作符包括: ||, &&. also if, while
* 最多操作符数目: 30
* 分值: 4
3.编译运行代码,得到最终分数
实验结论
位操作运算比高级语言的运算要更为抽象,难理解,需要注意很多细节以及底层运算逻辑。
通过移位以及异或等操作,可以实现各种运算。
五、实验总结与体会
在实验中也有遇到不少问题,需要注意一些细节,比如特殊情况等等,如果忽视的话很容易出错。
(by 归忆)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)