进制转换算法

1. 位值制计数法

  • 数码

    数中每个位置上的数,如 1,2,3,4

  • 基数

    每位数的数码可以有多少个,如10进制有0~9十个,比如基酒,有六种(威士忌、伏特加、龙舌兰、白兰地、金酒、朗姆)

  • 位权

    表示每位上1代表的数值大小,如十进制位数0,位权为10^0 = 1, 位数1 位权为10^1 = 10

2. 进制转换

2.1 二进制转十进制

数码*位权相加

10101111

2^7 + 2^5 + 2^4 - 1 =  175

2.2 二进制转八进制

没三个是一个八进制数码

10101111

010 101 111

2 5 7

2.3 二进制转十六进制

10101111

1010 1111

AF

2.4 十进制转二进制

29 / 2 ... 1
14 / 2 ... 0
7 / 2 ... 1
3 / 2 ... 1
1 / 2 ... 1

// 倒序排列
11101

....

3. 小数部分

// 类比十进制小数部分,小数后每一位数字位权都是前一位的十分之一
0.1245
1 x 10^-1 + 2 * 10^-2 + 4 * 10^-3 + 5 * 10^-4

// 二进制也类同,位权为前一位的二分之一
0.1101
1 * 2^-1 + 1 * 2^-2 + 0 * 2^-3 + 1 * 2^-4

3.1 二进制转十进制

// 同整数部分
0.11101

1 * 0.5 + 1 * 0.25 + 1 * 0.125 + 0 * 0.0625 + 1 * 0.03125 = 0.090625

3.2 十进制转二进制

0.85 * 2 = 1.7        1
0.7 * 2 = 1.4            1
0.4 * 2 = 0.8            0
0.8 * 2 = 1.6         1
0.6 * 2 = 1.2         1
0.2 * 2 = 0.8            1
...
发现无法除进

JDK进制处理

0b/0B... 二进制
0... 八进制
... 十进制
0x/0X 十六进制


// 前缀是0不是O
// 字母bx不区分大小写
// 在指定进制中使用规定数码
// 底层都是二进制存储
// JAVA默认都是使用十进制输出显示

// 可以指定进制输出
Integer.toBinaryString()
Integer.toOctalString()
Integer.toHexString()
// 或者
Integer.toString(val, radix2~36)

// 指定进制转换为十进制
parseInt(val, valRadix)/valueOf