學習三種移位方法後的總結:
邏輯移位:符號位也參與移動,簡單了當進行移位;移位後產生的空位補零。|被擠出去的一般放入cf(進製標誌)標誌位,如果沒有可以無視。
算術移位:在計算時發生的移位,操作物件是帶符號資料,需要考慮符號位。在移位時移出去的位數直接丟棄,符號位不變。
為了方便檢視直接列出乙個更適合記憶的**:
算術移位
型別操作
正數原碼、反碼、補碼
左移右移都補零
負數原碼
左移右移都補零
補碼左移補0
右移補1
反碼左移右移都補1
在算數移位中,原碼規則如下:
右移:高位補零,低位捨棄(丟精度)
左移:高位捨棄,低位補零(出誤差)
反碼規則:
處理反碼時,要注意正數和負數的區別,正數的反碼和原碼處理方法一樣,左移和右移的規則也和原碼一樣。對於負數:
右移:高位補1,低位捨棄
左移:低位補1,高位丟棄
(可以看到,負數時補的是1)
補碼規則:
如上面所提到的,正數的原碼、反碼、補碼三碼相同,處理方式也一樣。對於負數,它的處理方式和反碼還有一些不同:
右移:同反碼,低位捨棄,高位補1
左移:同原碼,低位補0,高位捨棄
負數的補碼和反碼不同在於補碼取反之後還要加1,進而導致進製。因此補碼右側一部分數字和原碼肯定是一致的。處理方法也要看齊原碼。
迴圈移位:被移走的數字轉而被放置到另一端補充空位。高位被移出就補到低位,反之一樣。
特別注意:有的數較為特殊,帶有進數字cf,如果題目要求,移位的時候cf也要參與移動。在移動的時候,cf位視為在數字的最左側參與移動。
以 0110 1110為例:
邏輯左移時,無論三碼中任意一種,資料整體向左一位。最左側的0直接丟棄,最低位補零。不考慮正負
0110 1110 -> 1101 1100
邏輯右移時,無論三碼中任意一種,資料整體向右一位。右側直接丟棄,最高位補零。不考慮正負
0110 1110 -> 0011 0111
另一種理解方式:
算術移位,需要考慮符號位。它的涵義是對乙個數進行放大或縮小。符號位不可發生改變
1)對於正數,三碼相同,無論左移和右移都是直接補0。
2)對於負數(標誌位為1),需要分情況討論:
原碼中,左移負數發生溢位。
在補碼中,算數左移時最右側補0;算數右移時最左側補1,也就是說移位時符號位也要參與移動,但是補齊時新符號位要和原符號一致。
1110 0110 -> 1111 0011
便於記憶,邏輯移位單純移動數字,空位統統補零。
算數移位,符號位不動,正數均補零;負數右移 原碼補零,其餘補符號位;左移反碼補1,其餘補0。
原碼在做乘除法的時候方便一些,但是加減法不方便,因為符號位不能參與運算,在計算原碼加減法時,不止要考慮符號,還要考慮異號時兩個數的絕對值大小,並且需要判斷結果的符號。
參考:王道21考研408
二進位制的左右移位運算
移位運算子 最重要的一點,雖然數字存貯在計算機記憶體中是以2進製的補碼形式,但是運用移位運算子時是對原始碼進行的。移位運算子 高位捨棄,低位補0 負數與正數的運算是一樣的 例 int a 10,g.g a 4 160 a 11010 2 110100000 160 10 移位運算子 符號位隨著運算數...
大數左右移運算
mp bit 30 mp nail 32 mp bit mp mask 3fffffffh base 30bit 28 30 mp limb t mpn rshift mp ptr rp,mp srcptr up,mp size t n,unsigned int cnt assert n 1 ass...
移位(左移,右移和無符號右移)
package sort public class shift int cc a m int dd a m int ee a m int qq x m 1 int pp x m int yy x m 1 system.out.println c c system.out.println cc cc ...