源碼
原碼就是符号位加上真值的絕對值, 即用第一位表示符号, 其餘位表示值.
[+1] 的原碼 = 0000 0001
[-1] 的原碼 = 1000 0001
第一位是符号位. 因為第一位是符号位, 是以8位二進制數的取值範圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
反碼
正數的反碼是其本身
負數的反碼是在其原碼的基礎上, 符号位不變,其餘各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
補碼
正數的補碼就是其本身
負數的補碼是在其原碼的基礎上, 符号位不變, 其餘各位取反, 最後+1. (即在反碼的基礎上+1)。
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
【-1】 原碼 10000001 反碼11111110 補碼 11111111
【3】 原碼 00000011 反碼 00000011 補碼 00000011
【-127】原碼11111111 反碼 10000000 補碼 10000001
【127】 原碼 01111111 反碼 01111111 補碼 01111111
首先要明白一點,二進制移位操作都是針對存儲在計算機中中二進制的操作,
那麼就要知道,正數在計算機中是用二進制表示的,負數在計算機中使用補碼表示的。
左移位:<< ,有符号的移位操作
左移操作時将運算數的二進制碼整體左移指定位數,左移之後的空位用0補充
右移位:>> ,有符号的移位操作
右移操作是将運算數的二進制碼整體右移指定位數,右移之後的空位用符号位補充,如果是正數用0補充,負數用1補充。
public static void main(String[] args) {
System.out.println(3<<2);//3左移2位
System.out.println(-3<<2);//-3左移2位
System.out.println(6>>2);//6右移2位
System.out.println(-6>>2);//-6右移2位
}
12
-12
1
-2
解釋:
1>
3 正數,在計算機中用二進制表示
00000000 00000000 00000000 00000011
00 00000000 00000000 00000000 00001100 左移兩位右邊補00 結果為12 2 的3次方 + 2的2次方 = 12
2>
-3 負數 ,在計算機中用二進制補碼表示
求-3的補碼,根據上面的方法 負數的補碼是在其原碼的基礎上, 符号位不變, 其餘各位取反, 最後+1.
10000000 00000000 00000000 00000011 -3源碼
11111111 11111111 11111111 11111100 -3反碼
11111111 11111111 11111111 11111101 -3補碼
11 11111111 11111111 11111111 11110100 左移兩位右邊補00
這個數第一位是1 說明是個負數,那就是某個負數的補碼。求出源碼就能知道是哪個負數
11111111 11111111 11111111 11110011 減一,取得反碼
10000000 00000000 00000000 00001100 第一位不變,其他為取反。得到 源碼。
是以此負數為 -12
3>.
6 為正數,在計算機中顯示二進制
00000000 00000000 00000000 00000110 6的源碼
00000000 00000000 00000000 00000001 右移兩位,正數右移,左邊補0 。
是以答案為 1
4> .
-6 位負數,在計算機中應該顯示補碼
00000000 00000000 00000000 00000110 6 的源碼
負數的補碼是在其原碼的基礎上, 符号位不變, 其餘各位取反, 最後+1
求出補碼
11111111 11111111 11111111 11111010 -6 的補碼
負數右移,左邊空缺用1補充
11111111 11111111 11111111 11111110 此為答案數字的補碼。是個負數
求此負數源碼
10000000 00000000 00000000 00000010 此為答案 -2