天天看點

《C語言程式設計魔法書:基于C11标準》——2.8 移位操作

本節書摘來自華章計算機《c語言程式設計魔法書:基于c11标準》一書中的第2章,第2.8節,作者: 陳轶 更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

現代處理器的計算單元中一般都會包含移位器。移位器往往能執行算術左移(arithmetic shift left)、算術右移(arithmetic shift right)、邏輯左移(logical shift left)、邏輯右移(logical shift right)、循環右移(rotational shift right)這些操作。

下面我們将分别介紹這些移位操作,這裡需要提醒各位的是,移位操作一般總是對整數資料進行操作,并且移入移出的都是二進制比特。然而,不同的處理器架構對移位操作的實作可能會有一些不同。比如,如果對一個32位寄存器做移位操作,倘若指定要移動的比特數超過了31,那麼在x86處理器中是将指定的比特移動位數做模32處理(也就是求除以32的餘數,比如左移32位相當于左移0位、右移33位相當于右移1位);而在arm、avr等處理器中,對一個32位的整數做左移和邏輯右移超出31位的結果都将是零。

2.8.1 算術左移與邏輯左移

由于算術左移與邏輯左移操作基本是相同的,僅僅對标志位的影響有些差別,是以合并在一起講。左移的操作步驟十分簡單,假設我們要左移n位,那麼先将整數的每個比特向左移動n位,然後空出的低n位填零。圖2-10展示了對一個8位整數分别做左移1位與左移2位的過程。

《C語言程式設計魔法書:基于C11标準》——2.8 移位操作

圖2-10中間由小寫字母a~h構成的方格圖即表示一個8位二進制整數,每個小寫字母表示一比特,并且字母a作為最高位比特,字母h作為最低位比特。左移1位後,原來的8位二進制數就變成了bcdefgh0;左移2位後,原來的8位二進制數就變成了cdefgh00。

2.8.2 邏輯右移

邏輯右移的操作步序是:先将整數的每一個比特向右移動n位,然後高n位用零來填補。圖2-11展示了一個8位二進制整數分别邏輯右移1位和2位的過程。

《C語言程式設計魔法書:基于C11标準》——2.8 移位操作

圖2-11中間由小寫字母a~h構成的方格圖即表示一個8位二進制整數,每個小寫字母表示一位比特,并且字母a作為最高位比特,字母h作為最低位比特。将原始二進制8位資料邏輯右移1位後,二進制資料變為0abcdefg;邏輯右移2位後,二進制資料變為00abcdef。

2.8.3 算術右移

算術右移與邏輯右移類似,隻不過移出n位之後,高n位不是用零來填充,而是根據原始整數的最高位,如果原始整數的最高位為1,那麼移位後的高n位用1來填充;如果是0,則用0來填充。圖2-12展示了一個8位二進制整數分别算術右移1位和2位的過程。

《C語言程式設計魔法書:基于C11标準》——2.8 移位操作

圖2-12中間由小寫字母a~h構成的方格圖,即表示一個8位二進制整數,每個小寫字母表示一位比特,并且字母a作為最高位比特,字母h作為最低位比特。将原始8位二進制整數算術右移1位之後,該二進制數變為aabcdefg;将它算術右移2位之後,變為aaabcdef。

2.8.4 循環右移

循環右移的步序是:先将原始二進制整數右移n位,移出的n位依次放入到高n位。圖2-13展示了将一個8位二進制整數分别循環右移1位和2位的過程。

《C語言程式設計魔法書:基于C11标準》——2.8 移位操作

圖2-13中間由小寫字母a~h構成的方格圖,即表示一個8位二進制整數,每個小寫字母表示一位比特,并且字母a作為最高位比特,字母h作為最低位比特。将原始8位二進制整數循環右移1位之後,該二進制整數變為habcdefg;将它循環右移2位之後,該二進制整數變為ghabcdef。

繼續閱讀