好进制java_进制详解 - 一个java小生的奋斗史 - 博客园

位数:从右到左为由低到高。最高位就是最左边的第一位

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

669b0406e3549fae20b615d668fc5a44.png

位运算符(~,|,&,^)

求:~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;

bb34486879a4af9a2cd1cabad0c2c900.png

F表示一个16进制,因为一个字节一个8位,所以一个字节等于2个16位。

1afe9e75739d112ba7236589956c7aef.png

向右移24为,就是将01111111 11111111 11111111 11111111变为00000000 00000000 00000000 01111111

将第一位(最高位)的第一个0移动到最后一位(最低位)的第一个0。从左到右:位数由高到低

cded465cf7f463c2d936421c3024f5ec.png

想要把一个int值存入流中,就要像上面一样存,先i>>>24到I,因为int是1个字节,write只能一个一个字节的存,所以先把最低位的1个字节存进去后,再存高位的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值