移位操作 邏輯左移 邏輯右移 算術右移

2021-09-12 04:16:48 字數 1117 閱讀 1371

常常會混淆移位操作的概念,因此在這裡記錄下測試程式。

public class main 

/*** 關於二進位制數加減法

* 原碼、反碼、補碼

* 正數:

* 原碼就是原始數值的二進位制表示形式,最高位符號位是0

* 反碼是原碼的按位置取反

* 補碼是反碼的基礎上+1

** 負數:

* 原碼就是最高位為1的表示形式

* 反碼是最高位的符號位不變,其餘位子按位置取反即可

* 補碼是反碼+1

** 在計算內,正數的表示為原碼,負數的表現為補碼,

** 3-3

** 3:

* 0011

** -3:

* 原碼:1011

* 反碼:1100

* 補碼:1101

** 補碼=反碼+1

** 3-3== 0011

* +1101

* -----------

* 10000

* -----------------

* 這裡的1是溢位位,捨棄即可,租後最後結果為0

** 8-8

** 8:

* 原碼:1000

* 反碼:0111

* 補碼:1000

** -8:

* 原碼:1000

* 反碼:1111

* 補碼:1000

** 說明:

* 雖然這裡的-8的補碼最後計算的結果為:10000,最高位的值要捨棄,變為了0000,但是由於它的最高位是1,因此符號位的最高位要填入1

* 最後變為了1000

** 8-8 == 1000

* +1000

* ------------

* 10000

* --------

* 最高位1捨棄,出現溢位值,最後結果為0

** ***/

private static void testshfit()

private static void log(string msg)

}

參考

02 算術左移邏輯左移,算術右移邏輯右移

算 術左移和邏輯左移一樣都是右邊補0 比如 00101011 算術左移一位 01010110 邏輯左移一位 01010110 對於二進位制的數值來說左移n位等於原來的數值乘以2的n次方 比如00011010十進位制是26,左移兩位後是011010 00轉成十進位制是104恰好是26的4倍。ps 這種...

算術移位邏輯移位

unsigned int i 8 int main 請問 上面的變數i是採用邏輯移位還是算術移位呢?邏輯移位,簡單理解就是物理上按位進行的左右移動,兩頭用0進行補充,不關心數值的符號問題。算術移位,同樣也是物理上按位進行的左右移動,兩頭用0進行補充,但必須確保符號位不改變。邏輯移位是指邏輯左移和邏輯...

邏輯右移和算術右移

問題描述 在寫嵌入式的程式中,常會將資料定義為unsigned int,這樣定義有什麼好處呢?下面從邏輯右移和算術右移的角度進行分析。分析 1 邏輯右移和算術右移 邏輯右移,移走的位填充為0 算術右移,移走的位填充與符號位有關,例如如果為負數,則移走的位填充為1。2 unsigned int 和 i...