天天看點

20135327郭皓 20135329李海空家庭作業彙總

第二章:

兩分題:

20135327 郭皓 :3

20135329 李海空:1

2.67 給你一個任務,編寫一個過程int_size_is_32(),當在一個int是32位的機器上運作時,該程式産生1,而其他情況則産生0.不允許使用sizeof運算符。下面是開始時的嘗試:

/*The following code does not run properly on some machies*/      
int bad_int_size_is_32(){
  int set_msb = 1<<31;
  int beyond_msb = 1<<32;
  return set_msb &&! beyond_msb;
}

當在SUN SPARC這樣的32位機器上編譯并運作時,這個過程傳回的卻是0.下main的編譯器資訊給了我們一個問題的訓示。
warning:left shift count >= width of type      

A:左移位數大于等于int長度,32位機器中最多左移31位,16位機器中最多左移15位。

B:用兩次左移來實作<<32:

int set_msb=1<<31;

int beyond_msb=set_msb<<1;

C:用三次左移來實作<<31與<<32:

int temp=1<<15;

temp<<=15;

int set_msb=temp<<1;

int beyond_msb=temp<<2;

三分題:

20135327 郭皓 :4

20135329 李海空:2

2.69 寫出具有如下原型的函數的代碼

/*

 *Do rotating right shitf.  Assume 0 <= n < w

 *Examples when x = 0x12345678 and w = 32:

 *   n = 4 -> 0x81234567 ,n = 20 -> 0x45678123

*/

unsigned rotate_right(unsigned x, int n);

答:本題主要是編寫一個循環右移的函數,具體代碼如下所示:

#include <stdio.h>

unsigned rotate_right(unsigned x, int n)

{

unsigned a;

a = x<<(32-n);

printf("%x\n",x>>n|a);

}

int main()

unsigned x;

int n;

printf("請輸入32位十六進制數");

scanf("%x",&x);

printf("請輸入右移位數(小于32大于等于0)");

scanf("%d",&n);

if(n>32||n<=0)

printf("右移位數小于32大于等于0!!!");

return 0;

rotate_right(x,n);

這裡我預設w=32 因為要是32位以内的十六進制數必須更改w的取值否則系統預設為32位十六進制,如需修改隻需将32改為w即可。

下圖為測試結果:

20135327郭皓 20135329李海空家庭作業彙總
20135327郭皓 20135329李海空家庭作業彙總

試試其他數:

20135327郭皓 20135329李海空家庭作業彙總
20135327郭皓 20135329李海空家庭作業彙總

第六章:

6.30

20135327 郭皓 :2.5

20135329 李海空:1.5

20135327郭皓 20135329李海空家庭作業彙總
20135327郭皓 20135329李海空家庭作業彙總

A:

由題意知 b=2 s=2 故 兩個低位是塊偏移,然後是兩位的組索引,剩下的位做标記:

20135327郭皓 20135329李海空家庭作業彙總

B:

1.對于位址0x409,塊偏移(CO):0x1  組引索(CI):0x2 高速緩存标記(CT):0x40 可見該标記的有效位為0,故不命中。

2.對于位址0x40A,塊偏移(CO):0x2  組引索(CI):0x2 高速緩存标記(CT):0x40  可見該标記的有效位為0,故不命中。

3.對于位址0x833,塊偏移(CO):0x3  組引索(CI):0x0 高速緩存标記(CT):0x83 可見該标記的有效位為1,高速緩存的标記位與位址中的标記位比對,故命中 讀出的值為0xD0。

6.37

20135327郭皓 20135329李海空家庭作業彙總

A

不命中率是100%,直接映射是每組隻有一個高速緩存行,塊大小為32位元組,表示可以存儲8個int數值。 數組是按照行優先存儲的,計算數組一行的大小為256*4=1024,是以高速緩存隻夠存數組的一行。 是以x[0]和x[1]的每一個元素對應的高速緩存是同一個塊。 是以,每次請求都在加載,驅逐,替換。不命中率為100%。

B

不命中率是1/8 ,隻有加載新行時發生不命中,緩存足夠大,可以存儲整個數組 是以隻有冷不命中,而塊大小為32位元組,表示可以存儲8個int數值 是以每次都會加載x[0][i]~x[0][i+7]共8個數值到緩存組中,這裡就隻有x[0][i]是不命中的 是以不命中率為1/8。

C

不命中率為1/8 ,高速緩存隻有1024位元組,不夠存儲數組,數組的第一行和第二行分别加載到緩存同一組的不同行,不會沖突,是以最後還是相當于隻有冷不命中,相當于每8個資料中隻有一個是不命中的 是以不命中率為1/8 。

D

不能了,塊大小不變,因為冷不命中的機率不可能被減小。

E

能,因為塊的大小增加,冷不命中的頻率就降低。