数据表示实验

计系2—数据表示实验

实验内容与要求

方法、步骤:
1、安装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下测试以上函数是否正确,指令如下:
*编译:./dlcbits.c
*测试:makebtest
./btest

实验内容过程以及内容

实验环境:linux操作系统,Ubuntu18

  1. intbitXor()函数
    思路:异或操作就是数值相同为一,不同为零,所以分别取出x与y不同的部分和y与x不同的部分,然后把这两个结果按位与即可得到x和y不相同的部分,最后把这个数取反就是x和y异或的结果。
    在这里插入图片描述

  2. tmin()函数
    思路:返回最小的二进制补码,直接将1向左移动31位生最小的二进制补码0x80000000
    在这里插入图片描述

  3. isTmax()函数
    思路:如果x是最大的二进制补码,那么对x加一后他就溢出变成最小的负数0x80000000,对最小的负数取反后为结果0。所以用x与(x+1)相加然后对结果取反,加上判断特殊情况(进行上述操作后结果与最大的二进制补码结果一样)负一的操作,对(x+1)的结果取非,把这两个结果加在一起再取非即可。
    在这里插入图片描述

  4. allOddBits()函数
    思路:生成一个奇数位都是1的数,将这个数与x按位与,如果x的奇数位都是1,那么与之后的结果还是我们生成的那个数,所以减去生成的奇数位都是1的数结果为0;如果x满足条件,则结果不为0,所以将结果取反之后返回即可。
    在这里插入图片描述

  5. negate()函数
    思路:直接将x取反加1返回即可。
    在这里插入图片描述

  6. isAsciiDigit()函数
    思路:判断x分别减去48和58后的符号位,将x减48后的结果的符号取非和x减58后的结果的符号进行按位与。
    在这里插入图片描述

  7. conditional()函数
    思路:取x取非后的相反数,然后分别用这个数和y、z进行按位与的操作并将这两个结果相加,返回相加后的结果。X取非后的结果只有0和1两种情况,而0和1的相反数是0和-1,任何数与-1相与之后的结果还是这个数自己,0与任何数相与结果为0.

在这里插入图片描述

  1. isLessOrEqual()函数
    思路:先得出y-x结果的符号,x与y符号是否相同。x<=y满足时有两种情况,第一种是x与y同正负并且y-x的符号位为零,第二种是x与y不同正负并且x是负数。所以将这两种情况的结果按位或后返回即可。
    在这里插入图片描述

  2. logicalNeg()函数
    思路:一个非零的数与它自己的相反数进行按位或后得到的数符号位必为1。基于此,对x进行上述操作并减去一后取相反数,等到的结果既是取非操作的结果。
    在这里插入图片描述

  3. howManyBits()函数
    思路:求解x表示为补码所需的最小的有效位数,对于正数,只需要从左往右找到第一个1的位置再加上一即可;对于负数,可以先把这个数变成正数再来求其所需要的位数。查找一的位置的话就用二分查找,先把x右移16位,看他是否为零,如果不为零,说明高16位还有1,则继续将向右移位后的x再右移8位进行判断;如果为零,说明高十六位没有1,则将x右移8位再进行判断。重复上面过程,当最后的右移位数为一时查找结束,将上面移动的位数相加再加上一个符号位既是所需的最少位数。
    在这里插入图片描述

  4. float_twice()函数
    思路:根据IEEE浮点数的表示方法,首先分别提取uf的符号位、符阶和数码。然后通过阶码判断是否是一个非规格化的数,如果是则将数码右移一位(相当于将x乘2);如果不是则将阶码加一(相当于将x乘2)。之后再判断阶码是否全为1或者阶码加一后溢出,溢出的话就令数码为0。
    在这里插入图片描述

  5. float_i2f()函数
    思路:将一个int型转成无符号的浮点数表示形式,先判断x是不是特殊值。如果x是零就直接返回0;如果x是最小的二进制补码,就令阶码为158,数码为零。如果x是一个正常数,就提取x的阶码,通过不断向右移位来获取x的阶码,然后将x的数码移到高位字节,折叠x的低八位后再来获取数码,之后再判断被折叠的第八位数是否有进位(向偶数舍入),有的话阶码加一,没的话阶码加零。然后再判断数码是否有溢出,有的话就刷新数码,阶码加一。最后将符号阶码数码组合起来即可。
    在这里插入图片描述
    在这里插入图片描述

  6. float_f2i()函数
    思路:提取出符号、阶码和数码,然后通过阶码判断这个数是否超出表示范围,最后根据符号位返回正数或者负数。
    在这里插入图片描述

实验结果

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值