《深入理解计算机系统》第二章部分习题

来源:互联网 发布:天一混元青岛店淘宝 编辑:程序博客网 时间:2024/05/22 06:18

人生第一篇博文。
《深入理解计算机系统》第二章部分习题:
2.62 int_shifts_are_arithmetic() 对int类型数使用算术右移返回1,否则返回0;
显然,只需考虑负数即可(非负数算术右移与逻辑右移相同)。这里以-1为例,-1算术右移一位,所产生的二进制码代表的数值不变;而逻辑右移则会使最高位为0,变成(1<<31)-1,最大值。

int int_shifts_are_arithmetic(){    //printf("%x %x\n",((-1)>>1),-1);    return ((-1)>>1)==-1;}

2.63 函数srl用算术右移实现逻辑右移,后面的代码不允许使用右移或者除法。

算术右移,若x为正数,则算术右移的结果等于逻辑右移的结果;若x为负数,则算术右移相较于逻辑右移会补上k个1。显然,x=a*2^(w-k)+b;x’=x>>k=(c)*2^(w-k)+a:若x>0,c=0;若x<0,c=(1<

unsigned srl(unsigned x,int k){    unsigned xsra=(int)x>>k;    unsigned c=!!(x&(1<<31));    unsigned u=((c<<(sizeof(unsigned)*8-k)));    return xsra+u;}

2.65 2.66都采用了二分的思想,具体的可以参考其他博客

2.75
若x和y是无符号数,其对应的二进制表达的补码为x’,y’;
x*y=(x’+x’(31)2^32)(y’+y’(31)*2^32)
=x’y’+x’*y’(31)*2^32+y’*x’(31)*2^32+x’(31)*y’(31)*2^64
所以两边除以2^32就可以得到所求部分
而x’*y’/2^32=signed_high_prod((int)x,(int)y);

unsigned unsigned_high_prod(unsigned x,unsigned y){    int yw=y>>31,xw=x>>31;    return signed_high_prod(x,y)+yw*x+xw*y;}

这个题目做起来邮费是邮费闹==
有兴趣再做其余的题目

0 0
原创粉丝点击