初探CSAPP:datalab1的一些思考
用一周的時(shí)間寫完了datalab,希望這學(xué)期能把8個(gè)實(shí)驗(yàn)寫完吧,我的計(jì)算機(jī)底層知識(shí)還是很薄弱,總結(jié)一下,把重點(diǎn)的思路和題發(fā)出來(lái)。
環(huán)境的話我使用的是wsl,安裝ubuntu2022,相比虛擬機(jī)真的是快了很多,只不過(guò)沒有圖形界面。
condtional
題目:
?* conditional - same as x ? y : z
?* ? Example: conditional(2,4,5) = 4
?* ? Legal ops: ! ~ & ^ | + << >>
?* ? Max ops: 16
?* ? Rating: 3
思路:
?和數(shù)字電路不同 x≠0 -->y 否則 x=0 -->z,?先把x轉(zhuǎn)化為bool邏輯值,如果x不為0,x的bool值就是1,然后還要把bool值轉(zhuǎn)化為, 我理解的數(shù)值值,0---0,1---FFFFFFFF
?要注意?~ !的區(qū)別,~是按位取反,!是邏輯取反。
?我最開始的思路是int sign = x^0; 異或提取,但是這樣是不對(duì)的,異或?qū)γ恳晃欢歼M(jìn)行了操作
logicalNeg
題目:
logicalNeg - implement the ! operator, using all of
?* ? ? ? ? ? ? ?the legal operators except !
?* ? Examples: logicalNeg(3) = 0, logicalNeg(0) = 1
?* ? Legal ops: ~ & ^ | + << >>
?* ? Max ops: 12
?* ? Rating: 4
思路:
? 這道題需要求出邏輯反,我認(rèn)為基本舍棄了,通過(guò)邏輯運(yùn)算,異或等等來(lái)完成,因?yàn)檫@些都只能按位算,沒辦法實(shí)現(xiàn)邏輯上的操作。對(duì)于邏輯為0的數(shù)而言,只有0本身。所以從0這個(gè)數(shù)找一些特點(diǎn)。0的補(bǔ)碼依然為0 ,不論是用10000,還是0000來(lái)表示,補(bǔ)碼仍等于本身。
?用x -x+1符號(hào)就進(jìn)行符號(hào)比較,符號(hào)位相同則為0,我最開始實(shí)現(xiàn)的是((x>>31)^((~x+1)>>31))+1,但是這個(gè)是有問題的,右移過(guò)程,如果符號(hào)位是1,直接就補(bǔ)滿1,這是算術(shù)右移的特性,所以需要想辦法先把符號(hào)位提取出來(lái)
?howManyBits
這個(gè)題是二分法,當(dāng)時(shí)沒想出來(lái),看的網(wǎng)友的答案
floatFloat2Int
要想把浮點(diǎn)數(shù),轉(zhuǎn)化為定點(diǎn)數(shù),首先要把符號(hào)位,指數(shù)位,小數(shù)位全都單獨(dú)表示出來(lái),單精度浮點(diǎn)數(shù),存在一個(gè)偏移量,8位指數(shù)部分,偏移量127.8bit本來(lái)可以表示0-255,但是 0 ?和 255被表示為無(wú)窮和0,非數(shù)。所以只能從1-254表示,減去偏移指數(shù) -126到127。
?floatPower2
把一個(gè)數(shù)做運(yùn)算,得到2^x次冪,這道題困擾了很久,主要問題是沒弄清楚規(guī)格數(shù)和非規(guī)格數(shù)之間的關(guān)系。1位符號(hào)位 8位指數(shù)位 23位尾數(shù)位,為了表示趨近于0的數(shù),趨近于無(wú)窮大的數(shù)整個(gè)浮點(diǎn)數(shù)被分為規(guī)格和非規(guī)格兩類。
更多內(nèi)容指路下面的知乎大佬的答案
https://zhuanlan.zhihu.com/p/343049681
最后的最后:
菜雞的日常自救-->
