計算機系統的位運算與邏輯運算
一、位
1、定義
二進制數字系統中數據存儲的最小單位,即每個二進制數0或1就稱爲位。位也叫比特(bit),8個bit組成一個字節(byte),每個字節表示程序中的某些文本字符。字長(word size)表徵了CPU一次能並行處理的最多二進制位數,例如32位機一次最多能處理32個bit組成的單元。
2、表示方法
位的本質是二進制數。由於一個byte由8位構成,即00000000 ~ 11111111,這種表示方法很冗長。把8位二進制數轉成十進制爲0 ~ 255,雖然表示起來方便,但是二-十進制轉換很麻煩。因此引入了十六進制表示法,原因在於十六進制表示8位二進制數很簡潔而且二-十六進制可以快速轉換。以0x或0X打頭的數字常量一般就是十六進制數。
3、位向量
固定長度爲w的由二進制代數組成的行向量稱爲位向量。位向量的邏輯運算是元素級的邏輯運算,例如=[,,……,,],=[,,……,,],那麼這兩個位向量的邏輯與運算就是&=[&,&,……,&],注意此時的二進制代數視爲表示邏輯真假的布爾代數。
任何“整型”數據類型都可以使用位運算。對於十六進制表示的字節進行位運算時,最好的方法是將十六進制轉二進制,位運算後再轉回十六進制,例如對char類型數據進行位運算。
4、位向量的應用
(1)表示有限集合
用位向量=[,,……,,]編碼任何子集⊆{0,1,2……,},當且僅當⊆時 = 1,於是用與或非就可以分別進行有限集合的交併補集運算
(2)位向量掩碼(BitMask)
通過位向量運算,有選擇地使能或屏蔽某些信號(或權限等)的位向量,稱爲位向量掩碼。
例如,給出=0x87654321,要求給出一個BitMask使其將除了的最低有效字節外其餘位都取補,而最低有效字節不變。於是我們可以給出=~0xFF,然後將與異或運算即可實現目標。下面要總結幾點:
①1^x 可以實現對x取反,0^x可以實現保持x不變
②上例位向量還可以是 = 0xFFFFFF00,然後直接進行^,但這樣的缺點是代碼的可移植性較差
5、移位運算
注意:
①位向量最高位爲0時,算術右移與邏輯右移等價,因爲把最高位視爲符號位的話,有符號的正數和無符號數等價
②循環移位:若對於一個w位位向量,進行k≥w的移位運算,則此時位移量爲k mod w,類似於循環隊列的索引結構。但這種行爲沒有保證,編程時應儘可能保證k<w
③移位的優先級較低,移位運算時要注意運算順序
二、布爾代數
1、定義
將邏輯真定義爲二進制數1,邏輯假定義爲二進制數0,這種表示邏輯運算的二進制代數稱爲布爾代數。利用布爾代數可以很好地研究邏輯推理。
2、邏輯運算
3、位運算與邏輯運算的關係
可以看出位級邏輯運算是元素級的布爾邏輯運算,即每個位向量元素進行0-1邏輯運算;而命題邏輯運算是把整個字節看成一個整體,將所有的非0的參數看成邏輯真(1),0看成邏輯假(0),所以就命題本身而言可以不爲布爾代數,執行邏輯運算時是把整體看成一個布爾代數,再進行相應的邏輯運算。
三、小結
本篇博客是對CSAPP這部分內容的一個總結和理解,參考資料也是這本書,作爲小白第一次寫博客,希望各位指出不足,相互交流