数据的底层逻辑
1、负数的二进制
- 电脑在进行负数运算的时候,负数并不是简单的将最高位置为1,而是对的这个负数的正数取反,然后加1
- 采用这种方式的原因:将正数与负数进行运算的时候,如果负数不采用补码加一的操作,结果会出错
- 如图所示:
2、位运算
-
移位运算
-
左移(<<):低位补零,高位去掉,向左移一位相当于x2
-
无符号右移(>>>):向右移动,右边舍去,左边补零
-
有符号右移(>>):向右移动,右边舍去,最高位是什么就是什么
-
-
逻辑运算
- 按位与(&): 两个都是1才为1,例如 0001 & 1 = 1,
- 按位或(|): 只要一个为1,就是1
- 按位取反(~):1取反为0;反之
- 按位异或(^):相异为真,相同为假
3、小数计算为什么出现不精确
现象:
float a = 0.1f*0.1f
// 结果为:0.010000001
-
当使用二进制去处理小数时,因为二进制只能表示2的次方的数,不能精确去表示0.1,从而在执行小数运算的时候,将出现以上错误
-
十进制里面可以精确表示,但在十进制在1/3上也是会出现不精确,只能表示到0.333,采用十进制运算,速度会减慢
-
可以采用java 中提供的BigDecimal,运算更加准确,单效率比较慢,其中Long类型可以适用于精确度不高但是大整数的运算,比如高额积分,BigDecimal适用于金融领域
4、字符的编码和乱码
- 编码分为非Unicode、Unicode
- 非Unicode:包括ASCII、GBK等,用于各国语言设置的编码方式
- Unicode:为了统一所有字符的编号
- 乱码的出现:解码时发生错误了,另外一种更加复杂是因为在解析的基础上进行了编码转换
- 恢复乱码的方式:乱码的原因主要是一次错误的编码转换,因此通过逆向的方式进行恢复,其中主要恢复两个关键信息
- 一个是原来的二进制编码方式A,另一个是错误解读的编码方式B
- 首先获取以B编码方式的乱码二进制,然后在以A编码方式进行解码,但是一般一次不一定能正确恢复们需要多次尝试不同的编码方式
5、char的含义
-
char是一个固定的占两个字节的无符号整数,这个正整数对应于Unicode的编号,用于表示那盒Unicode编号对应的字符
char c = "马"; char c = 39532;//表示马的Unicode编号 char c = 0x9a6c;//39532十六进制的表示 char c = ='\u9a6c';//Unicode字符形式