参考资料:《深入理解计算机网络(王达)》
文章目录
一,数制
1.1 基本数制
“数制”是“数据进制”的简称,也就是表示数据逢几进位的意思,如我们常用的十进制就是逢十进位,常见的还有二进制、八进制、十六进制。
- 二进制(Binary),二进制是计算机运算时所采用的的数制类型,基数是2,二进制数的标志为B,如(1001010)B,也可以用下标2来表示;
- 八进制(Octal),八进制的标志为O或Q,如(4603)O、(4603)Q,也可以用下标8来表示;
- 十进制(Decimal),十进制数的标志为D,如(1250)D,也可以用下标10来表示;
- 十六进制(Hexadecilmal),十六进制的标志为H,如(45A)H,也可以用下标16来表示,十六进制也常用前缀0x来表示。
为什么进制采用2、8、16这种,而不是9或12进制呢?
答:2、8、16分别是2的一次、三次、四次方,这就使得这三种进制之间可以很方便的直接进行互相转换。八进制或十六进制缩短了二进制,但保持着二进制的表达特点。
1.2 不同数制之间的相互转换
- 非十进制数转换为十进制数
按权相加法:非十进制数转换为十进制数就是把这些非十进制数按位以对应的权值(注意要区分整数位与小数位)展开,然后相加得出相应的十进制值。
- 十进制数转换为非十进制数
十进制数的整数部分采用“除基逆序取余法”(基数相除,然后逆序取余数),小数部分采用“乘基正序取整法”(基数相乘,然后正序取整数)。这里指的基数就是对应的数制,如二进制的基数为2,八进制基数为8,十六进制基数为16。
- 非进制数之间的相互转换
之前说过,二进制、八进制、十六进制分别是2的一次方、三次方、四次方,因此一位八进制数对应三位二进制数,而一位十六进制数则对应四位二进制数,他们之间的相互转换十分容易。
- 进制转换Java代码:
/**
* 类描述:进制转换器, 编写一个进制转换器, 可以让数字在 二进制, 八进制, 十进制, 十六进制自由转换
**/
public class RadixConversion {
public static void main(String[] args) {
RadixConversion radix = new RadixConversion();
// 11101001000.10111B, 1076O, 6374.65Q, 0X7A8C
radix.conversionDecimal("11101001000.10111B");
// 825D -> B, 10815.6D -> B, 658D -> O, 9240.65D -> O, 2508D -> H, 5420.82D -> H
radix.conversionDRadix("825D", Radix.BINARY);
}
/**
* 1.2.1同步练习: 进制转换, 非十进制数转换为十进制数, 将指定参数转换为十进制(Decimal)标志位为D
* @param str 待转换的参数, 可以是二进制(Binary)标志位为B, 八进制(Octal)标志位为O或Q, 十六进制(Hexadecilmal)标志位为0X或H
* @return
*/
public double conversionDecimal(String str) {
// 1. 首先判断str是什么进制的
String radix = "10";
double result = 0.0;
Map<String, String> map = new HashMap<>();
Map<Character, Integer> hexadecilmalMapping = new HashMap<>();
map.put("B", "2");
map.put("O", "8");
map.put("Q", "8");
map.put("D", "10"