《深入理解计算机系统》家庭作业共计15分
第二章(共计5分)
***2.66.
写出代码实现如下函数int leftmost_one(unsigned x),函数遵循位级整数编码规则,假设数据类型int有32位。代码最多只能包含15个算术运算、位运算和逻辑运算
int leftmost_one(unsigned x)
{
if(x==0)
{
return x;
}
if(x>(1<<31))
{
return 0x80000000;
}
x|=(x>>1);
x|=(x>>1);
x|=(x>>1);
x|=(x>>1);
x|=(x>>1);
x+=1;
x=x>>1;
return x;
}
**2.76.
生成一段代码,将整数变量x乘以不同的常数因子K,为提高效率,只使用+、-、<<运算,对于下列K值写出执行乘法运算的C表达式,每个表达式中最多用3个运算
A.K=5: (x<<2)+x
B.K=9: (x<<3)+x
C.K=30: (x<<5)-(x<<1)
D.K=-56: (x<<3)-(x<<6)
**2.82.
一些数字的二进制表示是由形如0.yyyyy……的无穷串组成,y是一个k位的序列。例如1/3的二进制表示是0.010101……(y=01)
A.设Y=B2Uk(y),这个数有二进制表示y。给出一个由Y和k组成的公式表示这个无穷串的值 x=Y/(2^k-1)
B.对于下列y值,串的数值是多少?
(a)001 x=1/7
(b)1001 x=3/5
(c)000111 x=1/9
第三章(共计2分)
*3.54.一个函数的原型为int decode2(int x, int y, int z);
int decode2(int x, int y, int z)
{
int k;
z -= y;
k = z;
k<<= 15;
k>>= 15;
return k*(z^x);
}
*3.69.
long trace(tree_ptr tp)
{
long ret = 0;
while(tp != NULL)
{
ret = tp->val;
tp = tp->left;
}
return ret;
}
作用是从根一直遍历左子树,找到第一个没有左子树的节点的值。
第六章(共计3分)
**6.23
假设要求设计一个每条磁道位数固定的旋转磁盘,已知每个磁道的位数是由最里层磁道的周长确定的,可以假设它就是中间那个圆洞的周长。因此如果把磁盘中间的洞做得大一点,每个磁道的位数就会增大,但是总的磁道数会减少。如果用r来表示盘面的半径,x*r表示圆洞的半径,那么x取什么值能使这个磁盘的容量最大?
答:假设半径为r的磁盘总的磁道是K,磁道沿半径方向是均匀分布的。除掉内部的x*r,剩下的磁道数为 (1-x)*K。则总容量为2*pi*x*r*(1-x)*K,其中pi,r和K都是常数,变量只剩下x*(1-x)。所以这个函数在x = 0.5的时候最大。即x取0.5时磁盘容量最大。
*6.26
下面的表给出了一些不同的高速缓存的参数。对于每个高速缓存,填写出表中缺失的字段。m是物理地址的位数,C是高度缓存大小(数据字节数),B是以字节为单位的块大小,E是相联度,S是高速缓存组数,t是标记位数,s是组索引位数,b是块偏移位数。
高速 |
m |
C |
B |
E |
S |
t |
s |
b |
1 |
32 |
2048 |
4 |
4 |
128 |
23 |
7 |
2 |
2 |
32 |
2048 |
4 |
512 |
1 |
30 |
0 |
2 |
3 |
32 |
2048 |
8 |
1 |
256 |
21 |
8 |
3 |
4 |
32 |
2048 |
8 |
128 |
2 |
28 |
1 |
3 |
5 |
32 |
2048 |
32 |
1 |
64 |
21 |
6 |
5 |
6 |
32 |
2048 |
32 |
4 |
16 |
23 |
4 |
5 |
第十章(共计1分)
*10.7
修改如图所示的cpfile程序,使得它用RIO函数从标准输入拷贝到标准输出,一次MAXBUF个字节
答:
int main(int argc, char **argv)
{
int n;
rio_t rio;
char buf[MAXBUF];
Rio_readinitb(&rio, STDIN_FILENO);
while((n = Rio_readnb(&rio, buf, MAXBUF)) != 0)
Rio_writen(STDOUT_FILENO, buf, n);
}
第八章(共计4分)
答:主进程只打印一行。主进程的直接子进程会打印一行,子进程的子进程再打印一行。所以一共输出3个“hello”输出行。
**8.15
下面这个程序会输出多少个“hello”输出行?
答:因为这里的子进程是return而不是exit,说明两个子进程都要到回到main函数去打印那里的hello。所以一共输出5个“hello”输出行。