1.Java中定义两个数,然后分别打印出它们的二进制表示:
System.out.println("Java二进制7: "+Integer.toBinaryString(7));
System.out.println("Java二进制-7: "+Integer.toBinaryString(-7));
输出:
Java二进制7: 111
Java二进制-7: 11111111111111111111111111111001
可以看到Java中对于数的表示属于有符号的,那么这个是怎么来的?
7好办,直接是111
-7转化二进制的过程:
(1)把-7转化成7,二进制是 111
(2)Java中对于不满32位的int二进制自动补齐,所以变成了 (29个0)111
(3)然后取反 (29个1)000
(4)然后加1 (29个1)001
这就是-7的整个转化过程,那么现在有一个问题,我有一个文本文件,每一行有八位二进制,表示的范围是(0~255),也就是用一个字节表示的无符号整数,我现在要把这些二进制转化成整数存到文件里应该怎么做?
文件:
line1 11111110 (254)
line2 00000000 (0)
假设我用Java读进了第一行,那么我直接打印出来的值是-2,不符合我们的要求,这时让-2变254有两种办法:
(1)用Java自带的方法,Byte.toUnsignedInt((byte) -2)(ps.-2的二进制表示就是line1),这样我们打印出来的就是254了
System.out.println(Byte.toUnsignedInt((byte) -2));
输出:254
(2)让-2与255做与(-2&255)
System.out.println(-2&255);
输出:254
第二种方法的原理:
Java中-2的二进制表示:11111111111111111111111111111110(这个二进制的后八位就是line1,我们直接打印的话Java把其当做了负数 -2)
Java中255的二进制表示:00000000000000000000000011111111(24个‘0’,8个‘1’)
做与后变为:00000000000000000000000011111110
这样做与后表示的数就是正数了 254。可以想一下,假设我们每一行用2个字节表示一个无符号数,那么我们把每一行变成正整数用方法2怎么做?
2.Java中的>>和>>>
'>>' 算术右移,向右移左边补符号位
'>>>' 逻辑右移,向右移左边补0
System.out.println("Java二进制-7: "+Integer.toBinaryString(-7));
System.out.println("-7>>2: "+Integer.toBinaryString(-7>>2));
System.out.println("-7>>>2: "+Integer.toBinaryString(-7>>>2));
输出:
Java二进制-7: 11111111111111111111111111111001
-7>>2: 11111111111111111111111111111110
-7>>>2: 111111111111111111111111111110 //正常应该这样(00)111111111111111111111111111110左边的两个0不显示