《深入理解计算机系统》Lab1:Data Lab(一) 下

计算机整数编码实验 《深入理解计算机系统》Lab1:Data Lab(一)icon-default.png?t=M276https://download.csdn.net/download/qq_53149358/85083344

 实验7

实现函数int fitsBits(int x, int n),如果x可以只用n位补码表
示则返回1,否则返回0(1<=n<=32)。要求最多使用15个操作符。
实验原理: 
一个数如果能左移N位后,在右移N位,仍然等于这个数,表明

这个数可以用N位来表示。

实验代码:

int fitsBits(int x, int n) 
{  
    int s = 32-n; 
    int m = x; 
    m = m<<s; 
    m = m>>s;  
    return !(m^x);     
} 

 实验8:

编写函数int divpwr2(int x, int n),计算x除以2的n次方的结
果,结果向零取整。要求最多使用15个操作符。
实验原理: 
 这道实验题,还是比较麻烦的,正数直接右移就行,但是负数右
移当不能整除时,是向无穷大靠近的;因此负数要加上进一个偏置,
然后再右移,结果才能正确;另外除以2的N次方能整除的条件是,
这个数的最低N位是0,负数要加上的偏置就是使最低N位变成0,
并使第N+1位变成1。具体看实现中的代码以及注释。
实验代码:

int divpwr2(int x, int n) 
{  
 //获取符号位,用来区分正负数 要不要加偏置  
 //需要注意的是移位是算术移位 如果x是负数,那么s全为1  
    int s = x >> 31;  
//偏置数 低N位全部是位 1 
    unsigned int  c = (1<<n)+(~0);  
    //如果是整数 偏置c被置成0 负数时不改变c的值  
    c = c&s; 
// 结果 
    return (x+c)>>n; 
} 

 实验9:

编写函数int negate(int x) 计算-x。
实验原理:负数的表示反码加1
实验代码:

int negate(int x) 
{  
    return ~x+1; 
} 

 实验10:

编写函数int isPositive(int x),如果x大于0返回1,否则返回
0,使用操作符的数量最大是8个。
实现原理: 

大于0的数,是非0正数,因此需要根据符号位确定是正数,还要不
是0。
实验代码:

int isPositive(int x) 
{  
 //确定符号位  
    int s = x>>31; 
//判断是不是0 
    int r = !(!x); 
//!s 正数为1 负数为0 
    return !s&r; 
} 

 实验11: 

 实现函数int isLessOrEqual(int x, int y),如果x小于等于y则
返回1,否则返回0。使用操作数的最大数量是24。
实现原理: 
 转化成两个问题,如果x,y符号相同,y-x的值是正数,如果x,
y符号不同,那么x是负数。 
 需要注意,符号相同相减不会发生溢出,符号不同时才有可能发
生溢出,因此单独依靠y-x的正负,不能得到x小于等于y。
实验代码:

int isLessOrEqual(int x, int y)  
{  
  //计算y-x并得到结果的符号位的值 
    int rsl = y-x;  
    int rs = rsl >>31; 
//获取x,y的符号位 
    int xs = x>>31;  
    int ys = y>>31;  
//x,y的符号是否一样,不一样ds 是1,一样ds 是0; 
    int ds = xs^ys;  
//(ds&xs) 符号不同 单x是负数 返回1 
//符号相同 但结果rs 是正数(!ds&!rs)。返回1 
    return ((ds&xs)|(!ds&!rs))&1; 
} 

 实验12:

编写函数int ilog2(int x),求x以2为底的对数的结果(向下取整)。
返回结果,使用操作符的数量最大位90个。
实现原理: 
 这是实验本质上是求最高位的1的位置,以32位整数为例,先看
最高位1是不是在高16位,可以利用!!(x>>16)表达式来计算,如
果!!(x>>16)是1,表示在高16位,因此暂时将结果设置成c=16;之
后再逐次逼近,计算!!(x>>(8+c))的值,如果结果仍然为1,那么就
将结果暂时设置成c=c+3;最后计算!!(x>>(1+c))的结果,就能得到
最终的答案结果。
实验代码:

int ilog2(int x) 
{  
    int c = 0;  
  c = (!!(x>>16))<<4; 
    c = c+((!!(x>>(8+c)))<<3); 
    c = c+((!!(x>>(4+c)))<<2); 
    c = c+((!!(x>>(2+c)))<<1); 
    c = c+(!!(x>>(1+c))); 
  
    return c; 
}  



 

  • 14
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值