標籤:
位元:從右至左為由低到高。最高位就是最左邊的第一位
1.二進位的最高位是符號位:0正數,1負數
2.正數的原碼,補碼,反碼都一樣
3.負數的反碼=它原碼符號位不變,其他位取反(0->1,1->0)。注意反碼和取反(~)運算的區別,反碼符號位不變,其他取反。而取反運算包括符號位都要取反
4.負數的補碼=它的反碼+1
5.0的反碼,補碼都是0
6.java沒有無符號數,java的數都是有符號的
7.電腦運算的時候,都是以補碼的方式運算
如:int a=1;最低位表示2^0,就是最後一位:2^(1-1) ,倒數第二位:2^(2-1),倒數第三位:2^(3-1)
00000000 00000000 00000000 00000001 –>表示1*2^0
00000000 00000000 00000000 00000011->表示1+1*2^1
00000000 00000000 00000000 00000111->表示1+ 1*2^1 +1*2^2
求:1+1=?,因為兩個都是正數,所以計算的時候雖然是以補碼的方式,但正數的補碼和原碼一樣
00000000 00000000 00000000 00000001
+00000000 00000000 00000000 00000001
00000000 00000000 00000000 00000010(逢二進一,上下1+1=2)
=0*2^0+1*2^1=2
求:1-2=?,實際就是求1+(-2),1的補碼就是原碼,-2的補碼是它的反碼+1,而它的反碼是符號位不變,其他取反
1的原碼:00000000 00000000 00000000 00000001
1的補碼:00000000 00000000 00000000 00000001
-2的原碼: 10000000 00000000 00000000 00000010
-2的反碼: 11111111 11111111 11111111 11111101
-2的補碼=反碼+1:
11111111 11111111 11111111 11111101
+00000000 00000000 00000000 00000001
=11111111 11111111 11111111 11111110
1+(-2)=?
1的補碼+(-2)的補碼:
00000000 00000000 00000000 00000001
+ 11111111 11111111 11111111 11111110
=11111111 11111111 11111111 11111111 (因為符號位(最高位)是1,所以表示負數,所以運算的結果是為補碼,所以要將補碼轉成原碼:反碼=補碼-1,然後將反碼的符號位不變,其他位取反)
11111111 11111111 11111111 11111111
- 00000000 00000000 00000000 00000001
= 11111111 11111111 11111111 11111110(反碼)->進行取反
10000000 00000000 00000000 00000001 (原碼)
= -1
位元運算符(~,|,&,^)
求:~2=?(取反,0->1,1->0,符號位一樣要去反)注意反碼和取反的區別,反碼符號位不變,其他取反
2的原碼: 00000000 00000000 00000000 00000010
取反: 11111111 11111111 11111111 11111101 (符號位是1,所以是負數,得到的那就是補碼)
反碼=補碼-1: -00000000 00000000 00000000 00000001
= 11111111 11111111 11111111 1111100
原碼=反碼取反: 10000000 00000000 00000000 00000011
=-(1+1*2^1)
=-3
求:~-5=?(取反,0->1,1->0,符號位一樣要去反),對負數取反,就是對負數的補碼進行取反
-5的原碼:10000000 00000000 00000000 00000101
-5的反碼:11111111 11111111 11111111 11111010 (反碼=符號位不變,其他取反)
+ 00000000 00000000 00000000 00000001
-5的補碼:11111111 11111111 11111111 11111011
對-5的補碼進行取反
00000000 00000000 00000000 00000100(符號位為正數,補碼和原碼一樣)
=4
求:2&3=?按位與(兩位全為1,則為1)
2:00000000 00000000 00000000 00000010
3:00000000 00000000 00000000 00000011
= 00000000 00000000 00000000 00000010
=2
求:2|3=?按位或(有一個1,則為1)
= 0000000 00000000 00000000 00000011
=3
求:-3^3=?(異或,兩個不同才為1)
-3的原碼:10000000 00000000 00000000 00000011
-3的反碼:11111111 11111111 11111111 11111100
-3的補碼:11111111 11111111 11111111 11111101
3的補碼: 00000000 00000000 00000000 00000011
異或: 11111111 11111111 11111111 11111110(最高位為1,是負數,得到的是補碼,將他轉成原碼)
反碼: 11111111 11111111 11111111 11111110
—00000000 00000000 00000000 00000001
=11111111 11111111 11111111 11111101(減時:將11111110退一位(不就是變成2嗎)類似11111102
然後11111102-00000001=11111101)
原碼: 10000000 00000000 00000000 00000010(反碼取反。符號位不變)
=-2
移位元運算(<<,>>>,>>)在記憶體中運算,非常快
移位元運算都是以補碼的形式運算
求:1>>2(低位溢出,符號位不變,並用符號位補溢出的最高位):2表示兩位
1的補碼:
0000000 00000000 00000000 00000001 然後向右移2位,則1跑出了32位中,其他的用0補齊
0(00)00000 00000000 00000000 00000000 (01)01跑出去了,左邊的向右移2位,符號位不變,並用符號位補最高位(因為0為符號位,所以用0去補)所以結果為0
求:-1>>2
-1的補碼:11111111 11111111 11111111 11111111 向右移2位,符號位不變,其他的用符號位補齊
1(11)1111 11111111 11111111 11111111 (11)11被溢出來了,然後用符號位補齊。因為符號位為1,所以用1去補齊。因為符號位為1,所以為負數,得到的是補碼,所以將補碼得到原碼
補碼:11111111 11111111 1111111 11111111
反碼:11111111 11111111 1111111 11111110
原碼:10000000 00000000 00000000 00000001
=-1
求:1<<2 (符號位不變,低位補0,移動一位相當於乘以2^1,移動2位相當於乘以2^2)
所以1*2^2=4
求:2<<2 = 2*2^2=8
求:-1<<2 ->-1*2^2=-4
求: 2<<4-> 2*2^4=32
求:1<<1 -> 1*2^1=2
求:3>>>2 (低位溢出,高位補0)
3的補碼:00000000 00000000 00000000 00000011
向右移2為:0(00)00000 0000000000 00000000 00000000 (11)
=0;
F表示一個16進位,因為一個位元組一個8位,所以一個位元組等於2個16位。
向右移24為,就是將01111111 11111111 11111111 11111111變為00000000 00000000 00000000 01111111
將第一位(最高位)的第一個0移動到最後一位(最低位)的第一個0。從左至右:位元由高到低
想要把一個int值存入流中,就要像上面一樣存,先i>>>24到I,因為int是1個位元組,write只能一個一個位元組的存,所以先把最低位的1個位元組存進去後,再存高位的
進位詳解