【計算機系統】位運算與邏輯運算

計算機系統的位運算與邏輯運算

一、位

1、定義

二進制數字系統中數據存儲的最小單位,即每個二進制數0或1就稱爲位。位也叫比特(bit),8個bit組成一個字節(byte),每個字節表示程序中的某些文本字符。字長(word size)表徵了CPU一次能並行處理的最多二進制位數,例如32位機一次最多能處理32個bit組成的單元。

2、表示方法

位的本質是二進制數。由於一個byte由8位構成,即00000000(2)_{(2)} ~ 11111111(2)_{(2)},這種表示方法很冗長。把8位二進制數轉成十進制爲0(10)_{(10)} ~ 255(10)_{(10)},雖然表示起來方便,但是二-十進制轉換很麻煩。因此引入了十六進制表示法,原因在於十六進制表示8位二進制數很簡潔而且二-十六進制可以快速轉換。以0x或0X打頭的數字常量一般就是十六進制數。

3、位向量

固定長度爲w的由二進制代數組成的行向量稱爲位向量。位向量的邏輯運算是元素級的邏輯運算,例如aa=[a(w1)a_{(w-1)},a(w2)a_{(w-2)},……,a1a_1,a0a_0],bb=[b(w1)b_{(w-1)},b(w2)b_{(w-2)},……,b1b_1,b0b_0],那麼這兩個位向量的邏輯與運算就是aa&bb=[a(w1)a_{(w-1)}&b(w1)b_{(w-1)},a(w2)a_{(w-2)}&b(w2)b_{(w-2)},……,a0a_0&b0b_0],注意此時的二進制代數視爲表示邏輯真假的布爾代數。
任何“整型”數據類型都可以使用位運算。對於十六進制表示的字節進行位運算時,最好的方法是將十六進制轉二進制,位運算後再轉回十六進制,例如對char類型數據進行位運算。

4、位向量的應用

(1)表示有限集合

用位向量aa=[a(w1)a_{(w-1)},a(w2)a_{(w-2)},……,a1a_1,a0a_0]編碼任何子集AA⊆{0,1,2……,w1w-1},當且僅當iiAAaia_i = 1,於是用與或非就可以分別進行有限集合的交併補集運算

(2)位向量掩碼(BitMask)

通過位向量運算,有選擇地使能或屏蔽某些信號(或權限等)的位向量,稱爲位向量掩碼。
例如,給出xx=0x87654321,要求給出一個BitMask使其將除了xx的最低有效字節外其餘位都取補,而最低有效字節不變。於是我們可以給出aa=~0xFF,然後將xxaa異或運算即可實現目標。下面要總結幾點:
①1^x 可以實現對x取反,0^x可以實現保持x不變
②上例位向量還可以是aa = 0xFFFFFF00,然後直接進行xx^aa,但這樣的缺點是代碼的可移植性較差

5、移位運算

在這裏插入圖片描述
注意:
①位向量最高位爲0時,算術右移與邏輯右移等價,因爲把最高位視爲符號位的話,有符號的正數和無符號數等價
②循環移位:若對於一個w位位向量,進行k≥w的移位運算,則此時位移量爲k mod w,類似於循環隊列的索引結構。但這種行爲沒有保證,編程時應儘可能保證k<w
③移位的優先級較低,移位運算時要注意運算順序

二、布爾代數

1、定義

將邏輯真定義爲二進制數1,邏輯假定義爲二進制數0,這種表示邏輯運算的二進制代數稱爲布爾代數。利用布爾代數可以很好地研究邏輯推理。

2、邏輯運算

在這裏插入圖片描述

3、位運算與邏輯運算的關係

可以看出位級邏輯運算是元素級的布爾邏輯運算,即每個位向量元素進行0-1邏輯運算;而命題邏輯運算是把整個字節看成一個整體,將所有的非0的參數看成邏輯真(1),0看成邏輯假(0),所以就命題本身而言可以不爲布爾代數,執行邏輯運算時是把整體看成一個布爾代數,再進行相應的邏輯運算。

三、小結

本篇博客是對CSAPP這部分內容的一個總結和理解,參考資料也是這本書,作爲小白第一次寫博客,希望各位指出不足,相互交流

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章