原碼 反碼 補碼及移位運算

2022-08-30 17:54:12 字數 1582 閱讀 1004

同學面試時被問到乙個問題:-1右移兩位是幾呢,然後在他思考期間,面試官露出了奇怪的表情……所以趕快複習一下機器碼及移位的相關知識

首先介紹一下概念與規則:

1、一般書寫表示的數叫做真值,真值在計算機中的表示方式叫做機器碼。

2、正整數用原碼、反碼、補碼三種方式表示時完全一樣,比如1(int型佔4位)的原碼、反碼、補碼都為00000000 00000000 00000000 00000001。

3、負整數用原碼、反碼、補碼表示時,符號為都為1,用二進位制表示的數值位各不相同。原碼符號位為1不變,數值位按位取反得到反碼,反碼符號位不變,最低位加1得到補碼。例如-1的原碼為10000000 00000000 00000000 00000001,反碼為11111111 11111111 11111111 11111110,補碼為11111111 11111111 11111111 11111111

4、為什麼機器碼要用補碼表示呢?  用補碼表示可以將減法運算轉化為加法運算,這樣在計算機中運算時比較方便,不論數是正是負,機器總是做加法。如1-1在計算機中是00000000 00000000 00000000 00000001 + 11111111 11111111 11111111 11111111 = 00000000 00000000 00000000 00000000 = 0

移位運算:

"<<"左移:右邊空出的位置補0,左移一位相當於乘以2。1左移一位即為00000000 00000000 00000000 00000001左移一位為00000000 00000000 00000000 00000010,為2。左移時符號位也會移動。例如1向左移動31位即00000000 00000000 00000000 00000001左移變為10000000 00000000 00000000 00000000,因此1左移31位變為int型別的最小值-2147483648。-1左移一位即11111111 11111111 11111111 11111111左移變為11111111 11111111 11111111 11111110,即為-2。

">>"右移:左邊空出的位,如果是正數則補0,若為負數則補0或1,取決於所用的計算機系統,其值相當於除以2。1右移一位即00000000 00000000 00000000 00000001變為00000000 00000000 00000000 00000000,即為0。-1右移一位即11111111 11111111 11111111 11111111右移1位為11111111 11111111 11111111 11111111,即為-1。

如果左移或右移的位數超過了該數值型別的最大位數怎麼辦呢?編譯器會用左移或右移的位數去模型別的最大位數,然後按餘數進行一位操作。即:

1>>32表示為1>>(32-32) = 1>>0 = 1; 1>>33表示為1>>(33-32) = 1>> 1 = 00000000 00000000 00000000 00000001 >> 00000000 00000000 00000000 00000000=0

-1<<32表示為1<<(32-32) = 1 << 0 = 1; 1<< 33表示為1<<(33-32) = 1<< 1 = 00000000 00000000 00000000 00000001<<00000000 00000000 00000000 00000010=2

運算(原碼 補碼 反碼)

表示不帶符號向右移動二進位制數,移動後前面統統補0 兩個箭頭表示帶符號移動,沒有 這種運算子,因為左移都是補零,沒有正負數的區別。如 12 的二進位制為 1111 1111 1111 1111 1111 1111 1111 0100 12 3 即帶符號右移3位,結果是 1111 1111 1111 ...

原碼 反碼 補碼 負數的移位

正數的原碼 反碼 補碼都相同 負數的反碼為原碼除符號位,其他位都取反,補碼為反碼加1。正數的移位 5為例,左 右移兩位 0000 0101 左移m位 最左邊的m位將丟棄,同時在最右邊補上零 0001 0100 右移m位 最右邊的m位將丟棄,同時在最左邊補上零 0000 0001 負數的移位 由於存在...

原碼 反碼 補碼運算規則

在學習原碼,反碼和補碼之前,需要先了解機器數和真值的概念.1 機器數 乙個數在計算機中的二進位制表示形式,叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號,正數為0,負數為1.比如,十進位制中的數 3 計算機字長為8位,轉換成二進位制就是00000011。如果是 3 就是 10...