常常會混淆移位操作的概念,因此在這裡記錄下測試程式。
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...