位数:从右到左为由低到高。最高位就是最左边的第一位
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个字节存进去后,再存高位的