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