1000 0000 0000 0000 0000 0000 0001 0100 原碼
1111 1111 1111 1111 1111 1111 1110 1011 反碼
1111 1111 1111 1111 1111 1111 1110 1100 補碼(反碼變補碼,+1)
1111 1111 1111 1111 1111 1111 1011 0000 左移兩位,低位補0
1111 1111 1111 1111 1111 1111 1010 1111 反碼(補碼變反碼,-1)
1000 0000 0000 0000 0000 0000 0101 0000 原碼
2^6 + 2^4 = 64 + 16 = 80,高位為1,代表負數,就是-80
總結:原碼到補碼和補碼到原碼都是取反再加1,同時補碼到原碼也可以先減一再取反
把乙個二進位制數右移n位,規則為:
除符號位外,全部右移n位,
如果數字是乙個無符號數值,則用0填補最左邊的n位,
如果數字是乙個有符號數值,則用1填補最左邊的n位,
也就是說如果數字原先是乙個正數,則右移之後在最左邊補n個0;如果數字原先是個負數,則右移之後在最左邊填補n個1。
例子:0000 0010 >> 1 = 0000 0001
0000 1010 >> 2 = 0000 0010
1000 0010 >> 1 = 1100 0001
1000 1010 >> 3 = 1111 0001
上面的例子,正數的容易理解,為什麼負數的是填補n個1呢,解釋如下:
負數在計算機內部是以補碼形式存放的,同樣,正數也是以補碼形式,只不過正數的補碼和原碼一樣。即資料在計算機中是以補碼的形式儲存的,所以一般所指「二進位制」為數的補碼表示如果數字原先是個負數,則右移之後在最左邊填補n個1。
上面的例子是移位出來結果是整數,不用四捨五入的,下面例子是需要四捨五入的。
1000 1010 的原碼1111 0110(-118),右移三位1000 1110(-14)。實際結果為(-118/8=-14.75)。按照符號位擴充套件得到的補碼1111 0001對應的原碼是1000 1111(-15),更接近實際值。可以看到符號位擴充套件的優越性:即符號擴充套件位移位很接近於實際值
首先左移和右移的區別是很好區分的
左移<< :就是該數對應二進位製碼整體左移,左邊超出的部分捨棄,右邊補零。舉個例子:253的二進位製碼1111 1101,在經過運算253<<2後得到1111 0100。很簡單
右移》 :該數對應的二進位製碼整體右移,左邊的用原有標誌位補充,右邊超出的部分捨棄。
無符號右移》 :不管正負標誌位為0還是1,將該數的二進位製碼整體右移,左邊部分總是以0填充,右邊部分捨棄。
舉例對比:
-5用二進位制表示1111 1011,斜體為該數標誌位
-5>>2: 1111 1011-------------->1111 1110。
11為補充標誌位
-5>>>2: 1111 1011-------------->0011 1110。
00為補充的0
1)負數的右移:負數右移的話,由於要保持它是負數,所以負數的二進位制的右邊補1。如果一直右移的話,最後就就變成0xffffffff 即-1
如: -4>>1 為-2 ;-4>>2為-1
2)負數的左移:跟正整數左移一樣,右邊補0,一直左移的話,最後就是0啦。-2<<2 為-4 ; -2<<31為0
如-4(1000 0100),其補碼為1111 1100,>>1的結果是1111 1110,對應原碼是1000 0010(-2);<<2的結果1111 0000,對應原碼1001 0000(-16)
再給乙個溢位例子:-16378<<2 -16378的原碼是1011 1111 1111 1010,對應的補碼是1100 0000 0000 0110,<<2是通過補碼左移,為0000 0000 0001 1000,這時計算機看到是正數,所以原碼也是這個,即24
對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變:
對於負數的右移:因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼(符號位不變,其餘位按照原碼取反加1),然後保證符號位不變,其餘位向右移動到x位,在移動的過程中,高位補1.等移位完成以後,然後保持符號位不變,其餘按位取反加1,得到移位後所對應數的原碼。即為所求。
舉例1:
-100帶符號右移4位。
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
右移4位 : 在高位補1
11111111 11111111 11111111 11111001
補碼形式的移位完成後,結果不是移位後的結果,要根據補碼寫出原碼才是我們所求的結果。其方法如下:
保留符號位,然後按位取反
10000000 00000000 00000000 00000110
然後加1,即為所求數的原碼:
10000000 00000000 00000000 00000111
所有結果為:-7
舉例2:
-100無符號右移4位。
-100原碼: 10000000 00000000 00000000 01100100
-100補碼: 保證符號位不變,其餘位置取反加1
11111111 11111111 11111111 10011100
無符號右移4位 : 在高位補0
00001111 11111111 11111111 11111001
即為所求:268435449
總結:正數的左移與右移,負數的無符號右移,就是相應的補碼移位所得,在高位補0即可。 負數的右移,就是補碼高位補1,然後按位取反加1即可。
經典筆記
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
數值在計算機中表示形式為機器數 計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的 是十進位制,正如亞里斯多德早就指出的那樣,今天十進位制的廣泛採用,只不過我們絕大多數人生來具有10個手 指頭這個解剖學事實的結果.儘管在歷史上手指計數 5,10進製 的實踐要比二或三進製計數出現的晚.摘...