《深入理解計算機系統》讀書隨筆 位操作

2022-05-11 03:52:59 字數 1601 閱讀 9413

剛剛看完的是關於位操作的一些內容,在這裡做一些記錄以備以後回來複習,主要都是一些我認為對於我之後編相關程式時會有提點作用的內容。下面內容中加引號是對原書中一些句子的直接引用。

1.用位向量表示有限集合

「位向量的乙個很有用的應用就表示有限集合」。例如用n個二進位制位便可以表示乙個n元集合的所有子集。

讀完這一部分,我有兩種理解。其一是:將二進位制的每一位資料對應於我們要分析的集合中的乙個元素,有和沒有分別對應於1和0,通過這樣的對應關係,最大的好處就是可以列舉那些本來不便於列舉的集合,方法就是將位向量轉化為對應的十進位制數。

對於位向量我的另乙個理解是,因為n位二進位制可以表示2^n個數,所以,如果將這2^n個數對映到一組元素,也就實現了n位二進位制數對集合元素的對映。和上面那種的區別在於,上面的那種是一位對應乙個元素,而現在是乙個向量對應於乙個元素。之所以會這麼想是因為想到了之前看過的一道面試題。大概內容是現在有8瓶藥水,其中有一瓶是有毒的,現在要用小白鼠做實驗檢查哪一瓶有毒,問最少需要幾隻小老鼠。

這個問題的答案是:3只 。方法是準備三個空杯子標記為0,1,2,將8瓶藥水按序號轉化為二進位制後,對應位為一,則在對應序號的杯子中假如這種藥水。最後將這三杯藥水分別給三隻小白鼠喝下,根據小老鼠的反應,通過二進位制找到對應的水杯。例如對於第三瓶藥水,二進位制為』011『,則在第0,1兩個杯子中加入藥水。如果這瓶藥水是有毒的,則喝下0,1兩杯藥水的小白鼠會出現反應。最終通過將小白鼠對應於二進位制向量,可以得到對應的有毒的藥水的序號。這個問題我覺著就是典型的將二進位制向量與集合元素相對應的問題。對於類似的問題,應該算是乙個啟發。另外如果推廣一下也可以將有三個狀態的事物對應於三進製位等等等等。

原書中還提到了對於位向量對應有限集合的問題,「布林運算|和&分別對應於集合的並和交」。在計算機系統中對這個知識也有廣泛的應用,其中之一就是掩碼,通過二進位制掩碼可以實現對一些位資料的遮蔽,比如我們非常熟悉的網路中的子網掩碼。

2.通過異或實現元素的交換

在實現兩元素交換值這一問題上,異或無疑是很好的方式,最大的好處就是不需要申請輔助空間,可以實現原地交換。實現**如下(原書**):

1 void inplace_swap(int *x, int *y)

2

這裡寫這個是希望記下兩點,一是「對於任意向量a,有a^a=0」。正是因為有這個特性,才有了上面的結果。

另乙個需要記下的是下面這樣乙個問題。在原書中有這樣乙個例子:利用上面的inplace_swap函式,我們可以實現乙個陣列中的元素頭尾兩端依次對調的函式(原書**如下):

1 void reverse_array(int a, intcnt)

2 8 }

剛看到**並沒有看出任何問題,這是非常簡單的一段**。但是如果我們執行他並給a陣列賦值,我們得到的答案將是。我們簡單分析一下就能知道會得到這樣的結果的原因是在first==last是,我們傳遞給inplace_swap函式傳遞的兩個引數指向了同一片位址空間(注意不是值相等,而是位址相同),這樣在執行(*x = *x ^ *y)這行**時,由於位址相同,*x和*y同時變為0,這樣後面兩次操作不管怎麼弄,都不會等於其他的了。這也就告訴我們乙個需要注意的點:在使用異或操作實現變數交換時,不能出現交換同一位址上值的情況。當然啦,要解決上面這個問題很簡單,只要將for迴圈的條件改為(first

深入理解計算機系統

關鍵路徑是在迴圈的反覆執行中形成的資料相關鏈。迴圈展開是一種程式變換,通過增加每次迭代計算的元素的數量,減少迴圈的迭代次數。重新結合變換能夠減少計算中關鍵路徑上操作的數量,通過更好地利用功能單元的流水線能力得到更好的效能。浮點運算不保證是可結合的,通常迴圈展開和並行地累積在多個值中,是提高程式效能的...

《深入理解計算機系統》

知乎 深入理解計算機系統 這本書需要什麼水平能看懂?15 213 18 218 15 513 introduction to computer systems schedule fall 2016 鏈結失效則 cmu15 213的課程主頁,有ppt,還有錄影,主講人就是這本書的作者。備註 備註 詳細...

深入理解計算機系統

系統的硬體組成 快取記憶體 作業系統管理硬體 程序虛擬記憶體 檔案amdahl定律 併發和並行 0和1組成的位序列,又稱為位元序列,8個位被組織成一組,成為位元組。每個位元組表示程式中的某些文字字元。系統中的所有資訊 包括磁碟檔案 記憶體中的程式 記憶體中存放的的使用者資料以及網路上傳送的資料,都是...