csapp實驗記錄 Datalab

2021-10-19 09:15:07 字數 3901 閱讀 3976

data lab實驗是關於計算機資訊的表示,主要涉及到整數,浮點數,以及相關操作的位級表示和操作

題目列表

題解bitxor(x,y)

計算 x ^ y,只使用與和取反操縱實現異或操作

**

int

bitxor

(int x,

int y)

通過與和非操作講二進位制位中相同的部分變為不同的部分,然後取反與,不同的部分變為零,相同的部分位1。則實現了異或的操作

tmin()

求補碼最小值

**

int

tmin

(void

)

補碼最小值就是符號位為1,其餘位都為0

istmax()

判斷是否是補碼最大值

**

int

istmax

(int x)

補碼最大值是符號位為0,其餘為都為1,那麼tmax + 1 則變為符號位為1,其餘為為0,只需要和原數異或取反,判斷是否全為0則能判斷是否為補碼最大值,但要注意,如何原數字都為1,那麼+1溢位位變為都為0,則異或取反也是全為0的數,那麼此時需要排除掉原數字都為1的這種情況(0xffffffff)。4-5行即為排除這種情況。

alloddbits(x)

判斷奇數字是否都為1

**

int

alloddbits

(int x)

使用掩碼,構造出奇數字都為1的二進位制數,然後將其與原數異或即可

negate(x)

整數取反

**

int

negate

(int x)

取反+1就是整數取反

isasciidigit(x)

計算輸入值是否是數字 0-9 的ascii

**

int

isasciidigit

(int x)

通過位級運算計算x是否在 0x30 - 0x39 範圍內就是這個題的解決方案。那如何用位級運算來操作呢?我們可以使用兩個數,乙個數是加上比0x39大的數後符號由正變負,另乙個數是加上比0x30小的值時是負數。這兩個數是**中初始化的ub和 lb,然後加法之後獲取其符號位判斷即可。

conditional(x, y, z)

使用位級運算實現c語言中的x?y:z三目運算子。

**

int

conditional

(int x,

int y,

int z)

只需要將x是零和非零轉換為全0和全1即可用來求返回的是y還是z。1~2行是將x轉換位全0或者全1

islessorequal(int x, int y)

使用位級運算實現小於等於

**

int

islessorequal

(int x,

int y)

實現小於等於,先比較符號位,如果符號位相同,則看y-x的值是否大於等於0,符號位不同返回符號為正的

logicalneg(int x)

使用位級運算實現邏輯非

**

int

logicalneg

(int x)

實現邏輯非,只需要看x是否是非零和零,根據補碼的相反數(取反+1),如果補碼的相反不是0,則原數是非0的,如果相反數為0則原數為0。但是有特例,補碼的相反數為本身,但是補碼最小值的符號位與其相反數的符號位位或為1,可以歸到其它非零整數的符號判斷上面。

howmanybits(x)

求值:「乙個數用補碼表示最少需要幾位?」

**

int

howmanybits

(int x)

如果是乙個正數,則需要找到它最高的一位(假設是n)是1的,再加上符號位,結果為n+1;如果是乙個負數,則需要知道其最高的一位是0的(例如4位的1101和三位的101補碼表示的是乙個值:-3,最少需要3位來表示)。

floatscale2(f)

求2乘以乙個浮點數

**

unsigned

floatscale2

(unsigned uf)

求浮點數乘以2,轉換為其實就是e + 1= >exp + 1。所以除去臨界條件,即如果exp == 0返回原數乘以2加上它的符號位。如果exp == 255則表示原數是nan,返回其本身。 如果exp + 1 == 255則表示原數乘以2後溢位到正無窮,返回正無窮0x7f800000帶上符號位即可。否則就返回結果

floatfloat2int(f)

實現浮點數轉為整數

**

int

floatfloat2int

(unsigned uf)

首先取出浮點數的各個部分(sign,expfrac),然後根據exp求出e,根據e的位數來移動frac或者判斷臨界情況。

floatpower2(x)

求2.0的x次冪

**

unsigned

floatpower2

(int x)

2.0(1.0 × 2^1)的位級表示:exp:1 + 127 = 128,frac = 0

所以2.0的x次冪,其實就是exp = x + 127

首先得到偏移之後的指數值exp,如果exp小於等於0(為0時,結果為0,因為2.0的浮點表示frac部分為0),對應的如果exp大於等於255則為無窮大或越界了。否則返回正常浮點值,frac為0,直接對應指數即可。

實驗結果

CSAPP 儲存體系實驗

1.觀察cache對程式資料訪問的加速作用 2.掌握程式設計中利用cache的基本方法 觀察 訪存模式對效能的影響 編寫 測試cache層次結構和容量等1.硬體 pc或任何一款具有cache的功能的計算機 2.軟體 windows linux作業系統 c語言編譯器 設計如圖1 2所示的 對二維陣列按...

CSAPP實驗環境搭建

配置ubuntu 選擇ubuntu作為實驗的執行環境,下面是一些配置命令。docker pull ubuntu 18.04 apt get updateapt get install sudosudo apt get install build essentialsudo apt get insta...

csapp實驗一總結

實驗一主要是關於位運算跟補碼和浮點數的表示的。整數部分 浮點數部分 在說題目之前我想先來寫一些浮點數表示的方法,以及一些注意事項。現在計算機基本上都採用了ieee754標準來表示浮點數,改標準把浮點數的表示為v 1 s m 2 ev 1 s m 2 e v 1 s m 2e這種形式,其中s ss稱為...