家庭作业汇总

《深入理解计算机系统》家庭作业共计15分

第二章(共计5分)

***2.66.

写出代码实现如下函数int leftmost_one(unsigned x),函数遵循位级整数编码规则,假设数据类型int32位。代码最多只能包含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。给出一个由Yk组成的公式表示这个无穷串的值  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);

 家庭作业汇总_第1张图片

int decode2(int x, int y, int z)
{
    int k;
    z -= y; 
    k = z; 
    k<<= 15;
    k>>= 15;
    return  k*(z^x);
}

 

*3.69.

 家庭作业汇总_第2张图片

 家庭作业汇总_第3张图片

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个字节

家庭作业汇总_第4张图片

答:

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分)

**8.14

下面这个程序会输出多少个“hello”输出行?

家庭作业汇总_第5张图片

家庭作业汇总_第6张图片

答:主进程只打印一行。主进程的直接子进程会打印一行,子进程的子进程再打印一行。所以一共输出3个“hello”输出行。

**8.15

下面这个程序会输出多少个“hello”输出行?

家庭作业汇总_第7张图片

答:因为这里的子进程是return而不是exit,说明两个子进程都要到回到main函数去打印那里的hello。所以一共输出5个“hello”输出行。 

 

你可能感兴趣的:(家庭作业汇总)