深入理解計算機系統LAB2

2022-10-17 23:12:16 字數 3811 閱讀 7376

根據實驗檔案裡的提示,補充15段**,熟悉對整型和浮點型數的操作,並成功除錯執行。

1. bitand

要求只運用~和|符號實現and的功能。a and b=not(not a or not b),根據德摩根律易得結果。

int bitand(int x, int y)

2. getbyte

得到x的第n個位元組的值,規定其中x的最低位為第0個位元組,最高位為第3個位元組。如果是第0個位元組,將x右移0個位元組再利用掩碼0xff將高位的三個位元組置為0。如果是求第1個位元組,將x右移1個位元組,同理利用掩碼。

可以知道,將x右移n個位元組也就是n*8位、即(n<<3)位。

接下來清除前三個高位位元組,保留最低位元組的資訊,與0xff進行&運算。

int getbyte(int x, int n)

3. logicalshift

邏輯右移是將移動後補充的高位置0,而算數右移時補充的和符號位相同。對於字x,需要進行邏輯右移n位。將x用s******x表示,s為符號位,算術右移n-1位的結果為ss…sxx..

(有n個s)。想要得到的結果是00…***..(n個0),所以如果能得到s』s』…s』111..

(n個s』)的話,按位與就能得到結果。首先提取符號位t,1左移31位得到100..00,與x進行按位與操作得到s000..

0,接著算術右移n位,得到ss..s00..00(n+1個s),再左移1位,得到s..

s0..0(n個s),取反得到s』s』..s』111..

1。這樣就能得到邏輯右移n位的結果了。注意,在得到s』s』…111的過程中,不能直接將s00..

0右移n-1位,考慮特殊情況,n為0時,右移-1位是不正確的。

int logicalshift(int x, int n)

4. bitcount

要求計算32位二進位制數x中1個個數。如果每次建立乙個000..01..

0的數按位與,再將結果全部相加的話,2*32+1+1肯定會超過最大操作次數限制。那麼可以想到,不檢測每一位,而一次檢測某幾位。這裡每次檢測4位。

初始化tmp=0x1111,x與之按位與,檢測每次第24,16,8,0位上的數字是否為1。將x右移i(1<=i<=7)位,再和temp進行按位與,結果加給val。利用val值的累加,分別計算每四個位元組(8位)上1的個數。

最後將val的四個位元組的值相加,保留最低位元組(8位)的資訊,即為x中1個個數。

int bitcount(int x)

5. bang

要求計算!x的結果,不能使用!運算子。

如果x=0,!x=1,否則!x=0。

對於特殊的0作分析,可以發現0的補碼和原碼相等,均為00..00,負數的補碼符號位為0,原碼符號位為1,而對正數進行取反+1時,符號位也與原碼不同。因此,如果能求得x取反+1的數的符號位,再異或、取反,就可以得到!

x。假設t=~x+1,x|t的最高位就是想得到的符號位,進行右移31位就可以移動至最低位,再與0x01進行按位與,就可以得到結果。

int bang(int x)

6. tmin

要求獲得補碼編碼的最小數。由書本p40的公式可知,當負權的係數、即符號位為1時,補碼表示負數,若後面的求和為0,值最小。也就是說補碼能表示的最小值是[10…0]。

也就是0x01<<31。

int tmin(void)

7. fitsbits

如果x可以被n位補碼表示則返回1,否則返回0。恰能用n位表示的補碼,最高位是符號位,其他n-1位表示該數的值,如果右移n-1位,均為符號位,非負數為0,負數為1。因此分兩種情況討論,如果是非負數,右移n-1位再取反是1,符號位取反是1,相與為1;如果是負數,x先取反再右移n-1位,取反後為1,與符號位的反相與,也為1。

考慮完這兩種情況後,用|符號連線。如果x不能被n為補碼表示,右移n-1位之後不全是符號位,經過!操作之後值為0,這樣與符號位的取反相與的結果就是0了,即不能被表示。

一開始對於案例存有疑問,認為5和-4都不能被3位補碼表示,至少需要4位。後來發現我是轉化為了原碼,認為不能用3位表示,但根據補碼編碼的公式,3位補碼的表示範圍為-4~3,因此-4是可以由3表示的。

int fitsbits(int x, int n)

8. divpwr2

計算x/(2^n)的值。一般算術右移等價於除以x的冪,但由於移位結果如果需要捨入,是向下捨入而不是向零捨入,所以對於負數來說直接移位得到的結果不一定正確。此時移入「偏置」一詞,見書本p65~66,可以得到,對於負數,先加上2^n-1的偏移量可以消除問題,得到正確的結果。

因此先算出2^n-1的值,即(1

9. negate

求出x的相反數。由於在計算機中整型資料以補碼編碼進行儲存,由公式可知,無論是非負數還是負數,進行取反加一都能得到相反數。因此直接return ~x+1。

int negate(int x)

10. ispositive

要求判斷x是否為正數,有兩個條件,符號為0,並且非符號位不全為0。反之,如果符號位為1,或者x取反為1(就是0的情況),說明不是正數。因此直接return !

((x>>31)|(!x))。

int ispositive(int x)

11. islessorequal

如果x<=y返回1,否則返回0。題目等價於判斷x-y<=0是否成立,也就是x-y的正負。當x,y同號時,只需判斷x-y的正負性,如果為非負數,則成立。

當x,y異號時,可能會發生溢位,要求結果與x的符號一致。先分別求得符號位,(x>>31)&1,(y>>31)&1。如果x,y異號,只要x的符號位為1即可,如果x,y同號,要求y-x符號位為0。

返回值分別考慮這兩種情況即可,返回(!(sx^sy)&s)|((sx^sy)&sx)。

int islessorequal(int x, int y)

12. ilog2

限定x>0,求以x為底的log值。由於是32進製數,取對數的結果不會超過31,可以用五位的二進位制數來表示。又可以知道,結果只和為1的最高位有關,因此只要找到從左邊起第乙個1的序號。

利用二分法,判斷32位數的左半邊16位是否全為0,如果全為0則丟棄,否則右移,再判斷16位的左半邊8位是否全部為0,如此重複,直到只剩下最後乙個數,將每次得到的數相加,即可得到結果。

int ilog2(int x) {

int s1,s2,s3,s4,s5;

int s=!!(x>>16);//whether x's left 16 bits aren't all 0

s1=s<<4;

x=x>>s1;

s=!!(x>>8);

s2=s<<3;

x=x>>s2;

s=!!(x>>4);

s3=s<<2;

x=x>>s3;

s=!!(x>>2);

s4=s<<1;

x>>=s4;

s=!!(x>>1);

s5=s;

return s1+s2+s3+s4+s5;

13. float_neg

計算無符號浮點數x的相反數。當x=nan時,直接返回引數。當x!

=nan時,將符號位取反,返回-x即可。另外,32位浮點數的符號位s佔1位,階碼exp佔8位,尾數frac佔23位。可以先利用與0x80000000按位異或,改反符號位,再將x與0x7ffffffff按位與,將所得值tmp與nan(0x7f800000)進行比較,如果大於nan,則直接將uf賦值給result返回。

unsigned float_neg(unsigned uf) {

unsigned result;

unsigned tmp;

result=uf^0x80000000;//reverse sign flag

tmp=uf&(0x7fffffff);

計算機系統結構實驗2報告

實驗2 流水線及流水線中的衝突 實驗報告 姓名 學號 班級 學院專業班級 姓名學號 實驗時間實驗室實驗台 指導老師簽字成績 一.實驗目的 1 理解計算機流水線基本概念。2 理解mips結構如何用5段流水線來實現,理 3 解各段的功能和基本操作。4 加深對資料衝突 結構衝突的理解,理解這兩類衝突對cp...

計算機系統結構實驗2報告

班級姓名 2010級 實驗日期學號 2013.3.29 實驗成績 實驗名稱cache效能分析實驗目的 要求及器材實驗內容 步驟及結果 1.加深對cache的基本概念,基本組織結構以及基本工作原理的理解。2.掌握cache容量,相關度。塊大小對cache效能的影響。3.掌握降低cache不命中率的各種...

計算機系統結構簡答題 2

一 計算機的多層次結構分為哪幾層?答 層次結構由高到低分別為 應用語言機器級 搞基語言機器級 組合語言機器級 作業系統機器級 傳統機器語言機器級和微程式機器級。二 軟 硬體取捨的三個基本原則是什麼?答 1 考慮在現有硬 器件 主要是邏輯器件和儲存器件 條件下,系統要有高的效能 比,主要從實現費用 速...