算術移位
算術移位(指數位位的移動)通過改變各個數位位和小數點的相對位置,進而改變各數位位的位權。可用移位運算實作乘法、除法。
算術移位針對有符号數,在移位過程中,符号位保持不變。
對于十進制來說,小數點左移1位,即數字右移相當于除以10,右移1位即數字左移相當于乘以10
那麼對于二進制來說,算術右移 1位,相當于除以2;算術左移相當于乘以2
在計算機硬體實作時,移位之後需要對空位進行添補,區分正負數來讨論:
由于正數的原碼、補碼、反碼相同,是以算術右移的時候高位補0,低位舍棄,若舍棄位是0,則相當于除以2,若舍棄位不是0,則會丢失精度;算術左移時,高位舍棄,若舍棄位是0,則相當于乘以2,若舍棄位不是0,則會出現嚴重誤差。
而負數的原碼算術移位時添補0
反碼算術移位時添補1
補碼左移添0,右移添1(最右邊的1在變成原碼時,會産生進位,是以從右往左第一個不是1的數字左邊同反碼,剩餘同原碼。是以添補規則左移時空出來右邊,添補規則同原碼;右移時空出來左邊,添補規則同反碼)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2csMTR610as1GZop1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLkZzY1UTNzUGZxIWOlRWO5Q2MxQzYhJTM5QTZ2cTNkVzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
【例】計算機硬體實作-20*7
【分析】7D=111B= 2 0 + 2 1 + 2 2 2^{0}+2^{1}+2^{2} 20+21+22
即就是對-20執行(不左移、左移1位、左移2位、加法)這些操作
邏輯移位
邏輯右移:高位補0,低位舍棄;
邏輯左移:低位補0,高位舍棄;
左移時最低位補0,右移時最高位補0的移位操作;可以把邏輯移位看做是對“無符号數”的算術移位(不考慮符号位)
應用場景舉例1:原碼一位乘法運算
在進行乘法運算過程中,乘數(儲存在MQ中)的最低位與被乘數(儲存在X中)運算後的結果會更新到ACC當中,之後(ACC和MQ)會執行邏輯右移,MQ低位丢棄,ACC邏輯右移後高位補0,MQ中新的低位繼續與被乘數運算,得到的結果累加到ACC中,重複以上步驟,得到最終的結果(ACC和MQ拼接起來)
應用場景舉例2:邏輯移位生成RGB色
👉戳這裡:邏輯移位RGB
原碼一位乘法:(機器字長n+1,數值部分占n位)
符号位通過異或确定;
數值部分通過被乘數和乘數絕對值的n輪加法、移位完成
根據目前乘數彙總參與運算的位确定(ACC)加什麼,若目前運算位=1,則(ACC)+[|x|]原;若=0,則(ACC)+0
每輪加法後ACC、MQ的内容統一邏輯右移
補充:循環移位
移出的那一位數值添補到空出的那一位
帶進位位的循環移位:
移出的那一位移動到進位位,空出的那一位用進位位的數值添補
應用場景舉例:大端存儲和小端存儲的互相轉換