1.整数的二进制表示
1)原码:可以直接通过计算得出的最直观的形式。
2)补码:原码取反加1。对负数的补码表示做补码运算就可以得到器对应正数的源码。
3)负数的表示就是对应的正数的补码。
4)计算机其实只能做加法运算,用负数的补码形式进行运算。
2.十六进制
1)将4个二进制位简化位一个0~15的数,10~15用字符A~F表示,这种方法称为十六进制。
2)十六进制表示,在前面加0x
3)二进制的常量表示,在前面加0b或者0B
4)查看整数的二进制方法和十六进制方法
Integer.toBinaryString(a);
Integer.toHexString(a); //返回一个字符串
3.位运算
1)左移:<< 右边的低位补0,高位就舍弃了,相当于十进制乘以2
2)无符号右移:>>> 向右移动,右边的舍弃,左边补0
3)有符号右移:>> 向右移动,右边的舍弃,左边的取决于高位,高位为什么就补什么
4.逻辑运算(本身意思)
1)&
2)|
3)~:按位取反
4)^
5.小数(浮点数)的二进制表示
1)m*(2^e)
m成为位数,e成为指数
2)一种是32位,对应的是float,1位表示符号为,23位表示尾数,8位表示指数
一种是64位,对应的是double,1位表示符号为,52位表示位数,11位表示指数
3)如何查看浮点数的具体二进制形式
Integer.toBinaryString(Float.floatToIntBits(value))
Long.toBinaryString(Double.doubleToLongBits(value))
6.字符的编码
1)编码分为两大类,Unicode编码,和非Unicode编码:ASCII,ISO 8895-1,Windows-1252,GB2312,GBK,GB18030
2)ASCII包含128个字符,刚好对应计算机最小存储单位byte
3)GB2312,GBK用两个字节表示汉字,GB18030用两个或者四个字节表示汉字
4)Unicode包含UTF-32,UTF-16,UTF-8,就是把Unicode编号对应到二进制形式,其中32使用4个字节,16大部分使用两个字节,少部分是4个字节,8使用1~4个字节,并且至于8兼容ASCII编码。
5)编码转换实际上转换的是编码的二进制内容,并没有改变字符看上去的样子。
7.乱码
1)乱码常见的原因:第一种是简单的解析错误。第二种是,在错误解析的基础上进行了编码转换。
2)解析错误二进制形式不会发生改变,只需要换一种正确的方式进行查看就能恢复。
3)解析错误后,二进制不变,数据形式发生改变,再进行编码转换,数据形式不会发生改变,但二进制已经改变了。
8.乱码恢复
1)使用具有编码转换的软件进行编码转换,知道恢复正确的字符
2)使用java
将多种编码格式保存在数组中,利用双层for循环进行解析。
核心代码:
Stirng str = "乱码字符串";
String str1 = new String(str.getBytes("windows-1252"), "GBK18030");//使用特定编码将字节数组转换为字符串
System.out.println(str1);
3)并不是所有的乱码都可以恢复。
9.char的真正含义
1)char本质上是一个固定占用两个字节的无符号整数,这个正整数对应于Unicode编号,用于表示那个Unicode编号对应的字 符。
2)char的比较就是Unicode对应的二进制编号的比较。