天天看點

原碼、反碼、補碼及移位運算

同學面試時被問到一個問題:-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