1. 程式人生 > >data lab (《深入理解計算機系統》lab1)

data lab (《深入理解計算機系統》lab1)

po主是在讀大學生一枚,最近在學校中上ics課(introduction to computer science)並做配套的10個lab。特在此將lab內容以及我的思考解答過程與各位大神分享,希望能給真正想了解此課及這些實驗之人一些幫助。若我的所言有不當之處,也請各位多多加以指正,也算是帶一帶我這個新人,我將感激不盡。

廢話不多說,直入正題。

datalab 是初讀此課的新手將要面臨的第一個lab(po主當初花了很久才適應啊!),相對來說比較簡單,主要是關於bits-level運算的一些題目。說實話,這個lab與整門課的方向比較脫節,很多bits-level的實現也確實更像智力測試題,不過既然有,便要攻克之。在做完之後,也確實對底層bits-level運算實現的理解有頗多加深。

Q1:(藍色部分是lab要求,其中包括對要求實現的函式的解釋、舉例、可以用的bits-level操作、最多運算元以及分值,下面是我的函式實現)


很經典的bits-level實現絕對值運算,這也是我認為整個lab中唯一對以後實際應用(包括面試)有價值的運算。不用if操作的絕對值運算可以有效加快運算速度。

第一步取符號位,(正為0,負為111……1),第二步抑或操作對於正數相當於不變,對於負數相當於取反加一(即得相反數),從而完成了統一的取絕對值。

************************************************************************************************************************************************************************

Q2:


狄摩根定律,不解釋。

************************************************************************************************************************************************************************

Q3:

boring but a little hard one.

題目要求是給出最高位和最低位,完成輸出在最高位和最低位之間所有數字為1,其他位為0的一個mask。如題目所給例子即是bitMask(5,3)=(111000)2。

整體思路是構建兩個mask,分別是從左端到最高位全部是1,剩下的為0的mask1,和從左端到最低位全部是1,其他是0的mask2,並將二者抑或,即可得到所求的mask。

而中間有一些小細節有其需要注意。

第一個是(exp<<highbit)<<1之所以不寫成exp<<(highbit+1),是因為若highbit=31,此時左移(highbit+1)=32位,該操作不進行任何移位。

第二個是最後result&(exp<<lowbit)看似多餘,實際上是防止(lowbit>highbit)的情況出現,並將其置0,使其符合題目要求。

************************************************************************************************************************************************************************

Q4:


分支選擇,若x為真(x!=0)則表示式=y,若x為假(x==0)則表示式=z。

利用!操作(當x=0時!x=1,當x!=0時!x=0)容易得到。

************************************************************************************************************************************************************************

Q5:


不解釋。。看不懂的話看看math logic吧。。

************************************************************************************************************************************************************************

Q6:

要求做一個mask所有偶數位都為1,奇數位都為0。

思路就是從01->0101->01010101->......

利用左移和or操作實現很簡單。

************************************************************************************************************************************************************************

Q7:


相同兩數抑或後為0,不同數抑或後不為0.利用此性質易解。

************************************************************************************************************************************************************************

Q8:


a little difficult.

第一步做一個mask記錄x y是否相等

二三步做x-y

第四步要分xy符號相同和xy符號不同兩種情況考慮,完成並取符號位。(正則為0,負則為1111……1)

第五步是將0 和1111……1都化成一位的0or1輸出。

************************************************************************************************************************************************************************

Q9:


很簡單,取符號位再少許進行運算輸出就行。

************************************************************************************************************************************************************************

Q10:

利用只有0|-0 的符號位是0,其他x|-x符號位是1 即可求出。

************************************************************************************************************************************************************************

Q11:


若x是2的倍數,必有x&x-1=0.

另外x還需要大於0。(即是上面的isNegative的反)

將兩個條件取和運算即可。

************************************************************************************************************************************************************************

Q12:


題目要求求出輸入值2進制中最低位的1的所在位置。

很巧妙的運算,我是通過實驗找的規律,具體證明我也無能為力,希望大神能幫忙指出!

************************************************************************************************************************************************************************

Q13:


利用其它操作符實現!操作。

思想就是壓縮法,保留出不為1的位置,最後壓縮到只有1位,結果是0則是表明該數之前全非1,結果是1表明該數必有某一位不為0(即該數非0)。

************************************************************************************************************************************************************************

Q14:


題目要求將每個byte位置顛倒。

思想很簡單,就是利用一個mask(1111 1111)將每個byte取出來,之後再利用|操作把每個取出的byte放到應該放的位置。

************************************************************************************************************************************************************************

Q15:


終於到了最後一個大boss了!

誒話說這個題看起來好長啊。。肯定很難吧。。

仔細分析一下,其實就是要用1個加號實現3個數字相加。

初看可能沒啥思路,但是仔細一想可以想到將三個數相加化成兩個數相加,最應該直接想到的便是一個數記錄無進位結果,另一個數記錄進位情況。

三個數相加的無進位可以用抑或表示,x^y^z即可。

而進位情況則是兩個數中,兩個加數的某一位同為1時需要進位。

3個數的情況下,最多某一位相加是1+1+1 不需要考慮雙重進位的情況,那麼結果很明瞭了。

word1是無進位結果,word2代表進位情況(不要忘記最後左移一位!)

************************************************************************************************************************************************************************

data lab 完成!

相關推薦

深入理解計算機系統 lab1 ——datalab 解答 95個ops

/* * CS:APP Data Lab * * <Please put your name and userid here> * * bits.c - Source file with your solutions to the Lab.

第1章 計算機系統漫遊深入理解計算機系統

printf 保存 並運行 用戶 數據 ogr 語句 亂碼 hello 1 #include <stdio.h> 2 3 int main() 4 { 5 printf("hello, world\n"); 6 } 1.1 信息就是位+上下文 h

儲存器層次結構深入理解計算機系統

閱讀《深入理解計算機系統》的第6章,也還是有一些收穫的。 首先在腦海中需要對計算機系統的儲存器層次結構有個定性的認識,如下圖所示:      從訪問速率最高(容量最小)的暫存器到訪問速率最低(容量最大)的分散式檔案系統,計算機將不同型別的儲存裝置劃分了多個層次。然後通過硬

優化程式效能的幾個方法來自於《深入理解計算機系統

int get_vec_element(vec_ptr v, long int index, data_t *dest) { if (index<0||index >= v->len) return 0; *dest = v->data[

一個絕對注意不到的小細節深入理解計算機系統第五章5.5及5.6

   下面的計算計算多項式的兩種不同方法,形如 a0+a1x+a2x^2········     第二個函式是根據horner法,通過反覆提出冪,來減少乘法的次數,按照道理說,既然polyh函式比poly函式減少了乘法的次數,那應該比poly快才對,可是事實正好相反,poly

data lab 深入理解計算機系統lab1

po主是在讀大學生一枚,最近在學校中上ics課(introduction to computer science)並做配套的10個lab。特在此將lab內容以及我的思考解答過程與各位大神分享,希望能給真正想了解此課及這些實驗之人一些幫助。若我的所言有不當之處,也請各位多多加

深入理解計算機系統配套實驗 data lab 函式詳解

/* 135. * bitAnd - x&y using only ~ and | 136. * Example: bitAnd(6, 5) = 4 137. * Legal ops: ~ | 138. * Max ops: 8 139. *

bomb lab 深入理解計算機系統》lab2

bomblab下載頁:http://download.csdn.net/download/u013648407/7279933  其中bomb是可執行檔案  需要用objdump指令反彙編,c1.txt是我反彙編所得到的assembly code。 ************

深入理解計算機系統序章------談程序員為什麽要懂底層計算機結構

人類 是你 驅動 計算機世界 執行過程 鍵盤 二進制 java虛擬機 調優   萬丈高樓平地起,計算機系統就像程序員金字塔的地基。理解了計算機系統的構造原理,在寫程序的道路上才能越走越遠。道理LZ很早就懂了,可是一直沒下定決心好好鉆研,或許是覺得日常工作中根本用不到這些,又

深入理解計算機系統1.2------存儲設備

高速 計算 想法 知識 1-1 運用 文件 字符 設備   上一章我們講解了hello world 程序在計算機系統中是如何運行的。 hello 程序的機器指令最初是存放在磁盤上的,當程序加載時,他們被復制到主存;當處理器運行程序的時候,指令又從主存復制到處理器。相似的,數

3.2《深入理解計算機系統》筆記內存和高速緩存的原理【插圖】

img sram 本質 text ddr rate too 是我 很大的 《深入計算機系統》筆記(一)主要是講解程序的構成、執行和控制。接下來就是運行了。我跳過了“處理器體系結構”和“優化程序性能”,這兩章的筆記繼續往後延遲! 《深入計算機系統》的一個很大的用處

深入理解計算機系統2.4------整數的表示無符號編碼和補碼編碼

class 映射 們的 c語言 正數 裏的 小例子 負數 類型   上一篇博客我們主要介紹了布爾代數和C語言當中的幾個運算符。那麽這一篇博客我們主要介紹在計算機中整數是如何表示的,諸如我們在編碼過程中遇到的對數據類型進行強制轉換可能會得到意想不到的結果在這篇博客裏你會得到解

深入理解計算機系統3.1------匯編語言和機器語言

找到 生產 有著 shu 符號 ces pc機 高效率 機器語言   《深入理解計算機系統》第三章——程序的機器級表示。作者首先講解了匯編代碼和機器代碼的關系,闡述了匯編承上啟下的作用;接著從機器語言IA32著手,分別講述了如何存儲數據、如何訪問數據

深入理解計算機系統3.3------操作數指示符和數據傳送指令

邏輯操作 無效 系統 get 訪問 www. 執行 十六 title   在上一篇博客 程序編碼以及數據格式 中我們給出了一個簡單的C程序,然後編譯成了匯編代碼。大家看不懂沒關系,後面的博客我們將逐漸揭開一些匯編指令的神秘面紗。本篇博客我們將對操作數指示符和數據傳送指令進行

深入理解計算機系統3.8------數組分配和訪問

2個 說明 add 如果 c++編譯 類型 操作 http 程序   上一篇博客我們講解了匯編語言中過程(函數)的調用實現。理解數據如何在調用者和被調用者之間傳遞,以及在被調用者當中局部變量內存的分配以及釋放是最重要的。那麽這篇博客我們將講解數組的分配和訪問。 1、

速讀《深入理解計算機系統第三版》問題及解決

情況 csdn 第六章 填充 以及 函數 順序 時鐘 管理所 第一章 計算機漫遊 P13:用戶棧和運行時堆有什麽區別?數據結構中經常說堆棧,這裏的堆和棧一樣嗎?和操作系統的堆、棧有什麽區別? 參考:堆和棧的區別(內存和數據結構) 操作系統: 棧:由操作系統自動分配釋放

深入理解計算機系統_3e 第四章家庭作業部分 CS:APP3e chapter 4 homework

ray design sed copy default ror this 處理 implement 4.52以後的題目中的代碼大多是書上的,如需使用請聯系 [email protected] 流水線部分只寫了偶數題號的,這幾天太浮躁,落下了好多課。。。 4.

20179215《深入理解計算機系統第三版》第三章

imu 組成 不但 圖片 想是 運行 href com 語言 《深入理解計算機系統》第三章 程序的機器級表示學習 讀書筆記 一、這章主要任務: ? 二、程序編碼 ?計算機系統使用了多種不同形式的抽象,利用更簡單的抽象模型來隱藏實現的細節。對於機器級編程來說,其中兩種抽

深入理解計算機系統》閱讀筆記--程序的機器級表示

還要 所有 執行文件 命令 不同的 指向 local 變量 section 一、為什麽要學習和了解匯編 編譯器基於編程語言的規則,目標機器的指令集和操作系統遵循的慣例,經過一系列的階段生成機器代碼。GCC c語言編譯器以匯編代碼的形式產生輸出,匯編代碼是機器代碼的文