計算機中的數據總是以二元狀态存在的,通常用0或1兩種符号來表示,它也方便用于表示電路中的高低電平。
1.2 二進制
在計算機中是用二進制來表示數據的。二進制中1=1,2=10,4=100,8=1000。生活中,我們用得比較多的就是10進制,那麼要怎麼把10進制與2進制進行轉換呢?
十進制轉換成二進制
10進制轉換成二進制
二進制轉換成十進制
二進制轉換成十進制
2 原碼、反碼和補碼在計算機中,最小的單位是位(bit),也就是二進制中的每一個數值,最小的數據存儲單位是字節(byte)。一個字節由8位組成,這8位中最左側的一位是符号位,0表示正數,1表示負數。
2.1 原碼原碼就是數據的實際值,如1的原碼為 0000 0001,-2的原碼為1000 0010,0的原碼為0000 0000。8位二進制數能表示的最大範圍是[-127,127]。
2.2 反碼正數的反碼是原碼本身,負數的反碼是在原碼的基礎上,符号位不變,其餘位取反,如1的原碼是0000 0001,反碼也是0000 0001;-2的原碼為1000 0010,反碼為1111 1101。8位二進制數能表示的最大範圍是[-127,127]。
2.3 補碼正數的補碼是原碼本身,負數的補碼是原碼的基礎上符号位不變,其餘位取反然後加1。8位二進制數能表示的最大範圍是[-128,127]。
【注:0的原碼、反碼、補碼是同一個!】
2.4 計算計中補碼參與運算1 (-2) = -1,對應的原碼為 0000 0001 1000 0010 = 1000 0011 = -3, 這是不正确的。
對應的反碼為 0000 0001 1111 1101 = 1111 1110,轉換成原碼 1000 0001=-1,正确。
如果 1-1用反碼計算的話,0000 0001 1111 1110 = 1111 1111,轉換成原碼就是1000 0000 = -0,是錯誤的表示。
所以如果用補碼來計算0000 0001 1111 1111 = 0000 0000,對應的原碼也是0000 0000=0,正确。在補碼中1000 0000表示-128。
2.5 溢出-35 -128用補碼參與運算結果是多少?
溢出
如圖,計算結果超出了8位,實際結果應該是-163,但是8位能表示的範圍是[-128, 127],所以上面的計算結果溢出了。取後8位即為溢出的結果93。
通過代碼表示:
public static void main(String[] args) {
byte b1 = (byte) -35;
byte b2 = (byte) -128;
byte b3 = (byte) (b1 b2);
// 這裡的結果是93
System.out.println("b3 = " b3);
// 這裡也是93
System.out.println(127 - 35 1);
}
溢出後的結果遵循這個規則,如果-128向下溢出1位,結果是127,溢出2位,結果是126,以此類推,-128溢出35,結果就是93。同理,127向上溢出1位就是-128。
2.6 單位及換算1B = 8b
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
3 位運算3.1 按位與運算(&)按位與的運算規則是:相同位都為1則為1,否則為0;
舉例:
1:原碼:0000 0001,反碼:0000 0001,補碼:0000 0001;
3:原碼:0000 0011,反碼:0000 0011,補碼:0000 0011;
所以:0000 0001 & 0000 0011 = 0000 0001,即 1 & 3 = 1;
1:原碼:0000 0001,反碼:0000 0001,補碼:0000 0001;
-3:原碼:1000 0011,反碼:1111 1100,補碼:1111 1101;
所以:1111 1101 & 0000 0001 = 0000 0001,對應的原碼為0000 0001,即1 & -3 = 1;
-1:原碼:1000 0001,反碼:1111 1110,補碼:1111 1111;
-2:原碼:1000 0010,反碼:1111 1101,補碼:1111 1110;
所以:1111 1101 & 1111 1110 = 1111 1100,對應的原碼為1000 0010,即-1 & -2 = -2;
3.2 按位或運算(|)按位或的運算規則是:相同位隻要有一個為1則為1,否則為0。
舉例:
1:原碼:0000 0001,反碼:0000 0001,補碼:0000 0001;
3:原碼:0000 0011,反碼:0000 0011,補碼:0000 0011;
所以:0000 0001 | 0000 0011 = 0000 0011,即 1 & 3 = 3;
3.3 按位異或(^)按位異或的運算規則是:相同位相同則為0,不同則為1。
舉例:
1:原碼:0000 0001,反碼:0000 0001,補碼:0000 0001;
3:原碼:0000 0011,反碼:0000 0011,補碼:0000 0011;
所以:0000 0001 ^ 0000 0011 = 0000 0010,即 1 & 3 = 2;
3.4 右移運算(>>)右移規則:符号位不變,低位(0)補齊,符号位補移出的高位(1)。
舉例:
- -3 >> 5:
-3:原碼:1000 0011,反碼:1111 1100,補碼:1111 1101;
1111 1101,右移5個,1000 0111,符号位補高位1111 1111,對應的原碼1000 0001,即-3 >> 5 = -1。
- 3 >> 5
3:原碼:0000 0011,反碼:0000 0011,補碼:0000 0011;
0000 0011右移5個,0000 0000,符号位補高位,結果還是0000 0000,即 3 >> 5 = 0;
3.5 左移運算(<<)左移規則:符号位不變,低位補齊。
舉例:
-3 << 5:
-3:原碼:1000 0011,反碼:1111 1100,補碼:1111 1101;
1111 1101左移5位,1010 0000,對應的反碼是1001 1111,原碼是1110 0000,即-3 << 5 = -96。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!