數碼的左右移位

2022-06-20 15:57:09 字數 1500 閱讀 6398

學習三種移位方法後的總結: 

邏輯移位:符號位也參與移動,簡單了當進行移位;移位後產生的空位補零。|被擠出去的一般放入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 ...