1 进制基础
概念:
进制就是进位制,是人们规定的一种进位方法,二进制逢2进1,八进制是逢8进1,十进制逢10进1,十六进制逢16进1。
不同进制形式:
-
二进制 0b或0B开头,由0和1组成
-
八进制 0开头,由0、1…6、7组成
-
十进制 常见整数,由0、1…8、9组成
-
十六进制 0x或0X开头,由0、1…8、9、a、b、c、d、e、f组成,大小写不区分
案例描述:
package com.briup.chap02;
public class Test063_Binary {
public static void main(String[] args) {
byte b1 = 0b01100001; //二进制
byte b2 = 97; //十进制
byte b3 = 0141; //八进制
byte b4 = 0x61; //十六进制
//打印出来结果全是97,为什么?
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
System.out.println(b4);
}
}
注意:不论什么类型的数据值,在计算机的底层存储时,统一按照二进制形式存储!
上述案例中,0b01100001、97、0141、0x61在计算机底层存储时,都是按二进制存储的,其值按照十进制表示,都是97。
思考:如何将2进制、8进制、10进制、16进制数进行转换呢?
2 进制转换
1)任意进制转换为10进制
转换方式:
结果值 = 系数*基数的权次幂相加
系数:每一位上的数据
基数:X进制,基数就是X
权:最右边那位对应0,每左移一位加1
案例展示:
// 97:系数为9和7,基数为10,权是0和1
97: 7*10^0 + 9*10^1 = 7 + 90 = 97
0b01100001: 1*2^0 + 0*2^1 + 0*2^2 + 0*2^3 + 0*2^4 + 1*2^5 + 1*2^6
= 1 + 32 + 64 = 97
0141:1*8^0 + 4*8^1 + 1*8^2 = 1 + 32 + 64 = 97
// 0x61:系数为6和1,基数为16,权是0和1
0x61:1*16^0 + 6*16^1 = 1 + 96 = 97
变量内存理解:
2)十进制转换为其他进制
除积倒取余,具体计算过程如下:
16进制也是一样的换算方式。
3)十进制到二进制的快速转换
对于不太大的正整数,我们可以采用一种快捷的方式(8421码)来获取其2进制形式,如下图:
上图运算步骤解析:
- 拆解正整数,将其分解为2的指数倍相加
- 找出2的指数倍 对应的 二进制1
- 根据变量类型确定占用的字节数及比特位,组合得到最终的二进制形式
4)二进制转换为8、16进制
2进制转化为8进制
-
从最低位开始,每3位分一组,不足3位的话高位补0
-
将得到的数字组合到一起,最前面以0开头
案例展示:
//定义变量
byte b = 126;
//获取其二进制形式
// 126 = 127 - 1 或 64 + 32 + 16 + 8 + 4 + 2
// 0b 0111 1110
//2进制 -> 8进制
//a.从最低位开始,每3位分一组,不足3位则高位补0
// 001 111 110
// 1 7 6
//b.最后组合到一起,最前面以0开头
//结果:0176
byte b2 = 0176;
System.out.println(b == b2);
2进制转换为16进制
-
从最低位开始,每4位分一组,不足4位的话高位补0
-
将得到的数字组合到一起,最前面以0x开头
案例展示:
//定义变量
byte b = 126;
//二进制形式:0b 0111 1110
//2进制 -> 16进制
//a.从最低位开始,每4位分一组,不足4位则高位补0
// 0000 0111 1110
// 0 7 e(14) 其中a:10 b:11 c:12 d:13 e:14 f:15
//b.最后组合到一起,最前面以0x开头
//结果:0x07e
byte b2 = 0x07e;
System.out.println(b == b2);