前言
前面了解了进制的基本意思,在实际工程中避免不了的需要通过进制转换来把十进制转换成计算机易存储的二进制或者十六进制。
一、非常简单的方法
只需要简单转换的用户可以通过微软自带的计算器功能进行转换。
打开方法1:左下角微软图标–>J字类中有计算器
打开方法2:或者直接搜索栏输入计算器按Enter键
在单机计算器界面左上角设置,旋转程序员模式,计算器界面变为右图样式。
右图红框中HEX(十六进制),DEC(十进制),OCT(八进制),BIN(二进制),蓝色小标签在那个旁边,当前键盘就可键入对应进制下的数。并直接显示当前键入对应的另外三种进制的值。
当前蓝色标签在十进制(DEC)上,输入16,可看见对应的:
HEX 10
OCT 20
BIN 0001 0000
二、计算方法
1.所有 转 十进制
二进制转十进制:
首先来看一组二进制:
0000,0001,0010,0011,0100,0101,0110,0111,1000
逢二进一,扳扳手指上述代表的是十进制的 0 ~ 8
特殊的关注:
二进制:0001,0010,0100,1000
十进制: 1 2 4 8
次方 : 2^0 2^1 2^2 2^3
找规律可以发现二进制下单位上的1都是2的某次方
1111 = 23 + 22 +21 +20 = 8 + 4 +2 +1 =15
所以二进制转十进制时:
- 先找为1位,0位可以省略;
- 数他在第n位(从右往左);
- 这一个1就代表了2n-1 的十进制数;
- 把所有1都加起来就得到了最后结果。
八进制转十进制:
同样看一组八进制数:
0,1,2,3,4,5,6,7,10
逢八进一,扳扳手指上述代表的是十进制的 0 ~ 8
特殊的关注:
八进制: 1, 10
十进制: 1 8
次方 : 8^0 8^1
以同样的规律可以发现依旧是一位上的1代表了8(当位位数-1) 的十进制数。
但是八进制的结构元素并不止0-1,而是0-7,当当位不为1而是2-7时怎么算呢?简单的,直接乘不就行了。
例如:
21
从左往右 第一位:1 8^(1-1)
第二位:2 2*8^(2-1)
所以八进制转十进制时:
- 先找非0位,元素为a;
- 数他在第n位;
- 这a就代表了a*8n-1 的十进制数;
- 把所有都加起来就得到了最后结果。
十六进制转十进制:
与前面方法相同
- 先找非0位,元素为a;
- 数他在第n位;
- 这a就代表了a*16n-1 的十进制数;
- 把所有都加起来就得到了最后结果。
总结:看久了其实可以发现,不管是二进制,八进制,十进制,十六进制其规则都是一样的
二进制: 1111 0001
十进制: 1×27+1×26+1×25+1×24+0×23+0×22+0×21+1×20 = 241
八进制: 1234 5670
十进制: 1×87+2×86+3×85+4×84+5×83+6×82+7×81+0×80= 2739128
十六进制: 123A BCDE
十进制: 1×167+2×166+3×165+10×164+11×163+12×162+13×161+14×160= 305839326
带小数的怎么解决呢?
依旧是上面的原则,只不过小数点后指数从-1往后递减。
二进制: 1111 .0101
十进制: 1×23+1×22+1×21+1×20 + 0×2-1+1×2-2+0×2-3+1×2-4 = 15.3125
2.十进制 转 所有
整数上:
十进制——>二进制 除二取余法
十进制——>八进制 除八取余法
十进制——>十六进制 除十六取余法
栗子:
十进制:372
除二取余: 除二 372 ………… 0
除二 186 ………… 0
除二 93 ………… 1
除二 46 ………… 0
除二 23 ………… 1
除二 11 ………… 1
除二 5 ………… 1
除二 2 ………… 0
1
从下往上收集余数:1 0111 0100(B) = 372(D)
除八取余: 除八 372 ………… 4
除八 46 ………… 6
5
从下往上收集余数:564(O) = 372(D)
除十六取余: 除十六 372 ………… 4
除十六 23 ………… 7
1
从下往上收集余数:174(H) = 372(D)
十六进制中余数可能大于9,不要忘了它的ABCDE这五个元素代表的值哦。
十进制:444
除十六取余: 除十六 444 ………… 12(C)
除十六 27 ………… 11(B)
1
从下往上收集余数:1BC(H) = 372(D)
你问二进制,八进制,十六进制之间怎么转换?
通过转成十进制过渡转换呗 ๑乛◡乛๑๑乛◡乛๑
小数上:
十进制——>二进制 乘二取整法
十进制——>八进制 乘八取整法
十进制——>十六进制 乘十六取整法
栗子:
十进制:0.125
乘二取余: 乘二 0.125 ………… 0
乘二 0.25 ………… 0
乘二 0.5 ………… 1 //取整后,整数部分归0
0
从上往下收集:0.001(B) = 0.125(D)
特殊的:
十进制:0.1458
乘二取整: 乘二 0.1458 ………… 0
乘二 0.2916 ………… 0
乘二 0.5832 ………… 1 //取整后,整数部分归0
乘二 0.1664 ………… 0
乘二 0.3328 ………… 0
乘二 0.6656 ………… 1
乘二 0.3312 …………
。
。
。
一直往下的话会发现要往后,很多很多很多很多位,可能都结束不了(八进制,十六进制也一样)。
所以要往下几位,取决于计算机分配给存储这个数据的空间长度(这个之后开个小节再讲)
从上往下收集:0.001001…………(B) ≈ 0.1458(D)
乘八取整: 乘八 0.1458 ………… 1 //取整后,整数部分归0
乘八 0.1664 ………… 1
乘八 0.3312 ………… 2
乘八 0.6496 ………… 5
乘八 0.1968 ………… 1
乘八 0.5744 ………… 4
乘八 0.5952 ………… 4
。
。
。
从上往下收集:0.1125144…………(O) ≈ 0.1458(D)
乘十六取整: 乘十六 0.1458 ………… 2
乘十六 0.3328 ………… 5
乘十六 0.3248 ………… 5
乘十六 0.1968 ………… 2
乘十六 0.688 ………… 11(B)
。
。
。
从下往上收集余数:0.2552B…………(H) ≈ 0.1458(D)
3.二进制与八进制,十六进制之间转换小技巧
观察0000(B)小伙伴们能发现什么呢?
B to H
填满0000变为1111得到15(D)再加1就成16——(十六进制中满16就该进位啦)
也就是10(H) = 1 0000(B) 好像四个二进制可以表示一位十六进制哦。
大胆尝试:
1100 1111 0101(B)
笨蛋办法: 先转十进制——> 3317(D)
再转十六进制——> CF5(D)
聪明办法: 从右往左四位
二进制换一位——> 1100 1111 0101
十六进制 ——> C F 5
很完美哦。
正数部分从右往左以四个为一组,小数部分从左往右四个为一组(可以自己测试一下)。
B to O
八进制怎么看呢?
同样原理,二进制中111(B) = 7(D) (八进制逢八进一了呦要)
是不是 三个二进制可以代表一个八进制呢?
大胆尝试:
1100 1111 0101(B)
笨蛋办法: 先转十进制——> 3317(D)
再转八进制——> 6365(D)
聪明办法: 从右往左四位
二进制换一位——> 110 011 110 101
十六进制 ——> 6 3 6 5
同样完美哦。
正数部分从右往左以三个个为一组,小数部分从左往右三个为一组(可以自己测试一下)。