捐助郴维网
感谢您对郴维网的支持,你的支持将是郴维网持续发展的动力!
二维码
×
当前位置:郴维网 >扩展阅读 > 正文
4 2018.02

进制转换

点击次数:501 更新时间:2018-2-4 21:57:28  【打印此页

进制转换



学习编程,尤其是底层编程,免不了要接触到各种进制数(二进制/十进制/十六进制),以及它们之间的相互转换。

先看下表:

 

不难发现,它们之间是有规律可循的。

比如 11(2)== 2^2 - 1(10);111(2)== 2^3 - 1(10);1111(2)== 2^4 - 1(10);1111 1111(2)== 2^8 - 1(10)

又比如 1111(2)== F(16),1111 1111(2)== FF(16)

1:小括号中的数字表示进制数,即(2)是二进制的意思。

2:脱字符(^)表示幂(次方)的意思,3^2 3 2 次幂(方)。

知道这上边两条规律,对你平时开发调试程序是很有帮助的。 

比如你看到二进制数 111111,立刻就知道对应的十进制数是 2^6-1,即 2 * 2 * 2 * 2 * 2 * 2 - 1 == 63

比如你知道为何调试程序的时候调试器总会将内存中的二进制数转换为十六进制 —— 因为恰好 8 位二进制数(一个字节)用 2 位十六进制数即可表示,非常节约空间。

 

上图是十六进制,下图是二进制:

 


二进制数和十进制数之间的相互转换

二进制 -> 十进制

从二进制数转换到十进制数,我们使用“按权相加”的方法。

什么是“权”?

所谓“权”,即“位权”!

比如说一个八位的二进制数 0010 1010,从右往左(←),每个位的“位权”依次是 01234567,如下图所示:

 

下边是公式:

十进制数 == 依次将每个二进制位的值 * 2的位权次方再相加 

说人话就是,上边的二进制数 0010 1010 转换成十进制数就是:

      0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 0 * 2^4 + 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 0 * 2^0

== 0 * 128 + 0 * 64 + 1 * 32 + 0 * 16 + 1 * 8 + 0 * 4 + 1 * 2 + 0 * 1

== 42

好,再举个例子,将二进制数 0100 1101 转换成十进制数就是:

      0 * 2^7 + 1 * 2^6 + 0 * 2^5 + 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0

== 0 * 128 + 1 * 64 + 0 * 32 + 0 * 16 + 1 * 8 + 1 * 4 + 0 * 2 + 1 * 1

== 77

小甲鱼温馨提示:按权相加的方法适用于任何进制数到十进制数的转换。

二进制(补码)-> 十进制

上边的转换是对于无符号数来说的,如果万一摊上一有符号数,那转换就不是这么简单了……

当然,也不是那么复杂! 

对于有符号数(补码)来说:

如果符号位为 0,表示该数为正数,转换跟无符号数没什么两样。

如果符号位为 1,表示该数为负数,此时符号位的位权不变,但该位的权值应该乘以 -1 得到。


举个栗子,将有符号数 0011 1100 转换成十进制数,与无符号数的做法是一样的:

      0 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== 32 + 16 + 8 + 4

== 60

然后如果符号位为 1,表示这是一个负数,比如 1011 1100,那么符号位的权值就应该乘以 -1 得到:

      -1 * 2^7 + 0 * 2^6 + 1 * 2^5 + 1 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128 + 32 + 16 + 8 + 4

== -68

在举个极端点的例子,比如 1000 0000:

      -1 * 2^7 + 0 * 2^6 + 0 * 2^5 + 0 * 2^4 + 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 0 * 2^0

== -128

现在明白为啥 1000 0000 表示 -128 了吧~ 


十进制 -> 二进制

从十进制数转换到二进制数,我们使用“辗转相除”的方法。不过我们这里不是要求最大公约数,而是取其余数。

即将待转换的十进制数不断地除以 2,直到商为 0,将每次除得的余数倒序拼凑起来,便是对应的二进制数……

好吧,No pic you say a J8:

 

尼玛上边这图我画了半个小时,强迫症害死人……


二进制数和十六进制数之间的相互转换

鉴于二进制和十六进制之间有着密不可分的暧昧关系,你只需要记住下边这个表格即可:

 

一旦遇到很多二进制数,你就从右往左,每四个为一组,查上表(其实用不了多久你就能记住它们间的对应关系了@_@)

一旦遇到十六进制数,你心里也有底了,不过就是把每个十六进制数拆解成 4 位二进制数嘛。


这还是需要计算呐,有木有更好的方法?!

有!回复“朕想知道”,教你最快速的转换方法:

Linux or Mac OS

Linux 在命令行下有个强大的计算器工具 —— bc

如果是安装小甲鱼提供的最小版安装 CentOS 系统,我们需要自行安装它:

 

1.    切换到 root 用户;

2.    yum -y install bc 即可。


OK,使用 bc 进行进制转换非常简单:

echo "obase=输出进制数;ibase=输入进制数;输入的数字" | bc

小甲鱼温馨提示:要先 obase,再 ibase,最后数字(o)~

 

Windows7 8):

快捷键:Win键 + r

 

输入:calc

 

打开系统自带计算器,点击“查看”,选择“程序员”:

 

左侧选择输入的进制数,然后输入待转换的数字:

 

在左侧重新选择需要转换的进制数即可:

 

Windows10):

(⊙o⊙)…

被微软骗去升级 Win10 之后,赶脚很多东西都变得不一样了……

比如计算器变成了酱紫:

 

点击上图红圈位置,依然可以看到熟悉的选项:

 

点击“Programmer”,其它操作就差不多啦……

值得一提的是新的计算器增加了不少鸡肋功能,有空大家自个儿体验下吧,这里就不赘言啦~

Tips
郴维网为您提供各类专业服务:
软件开发,电脑配件销售,WIFI路由器销售,上门电脑维修,上门安装系统,系统安装,软、硬件安装,电脑除尘清灰,显示器维修,WIFI安装调试,服务器维护,数据恢复,密码破解,网络布线,网络检修,打印机维修,打印机加碳粉,苹果电脑安装系统,苹果电脑安装双系统,监控安装维护,电脑外包,笔记本电脑维修,餐饮、美容行业软件安装 等。。。。。。
点击次数:501 更新时间:2018-2-4 21:57:28  【打印此页
关键词推荐:郴州电脑城 郴州电脑维修公司 维修电脑公司 郴州软件开发 上门电脑维修 上门安装系统 笔记本电脑维修 郴州打印机维修 打印机加碳粉 电脑安装双系统 苹果电脑双系统 液晶显示器维修 联想笔记本维修 联想笔记本维修电话 戴尔笔记本维修电话 郴州戴尔笔记本维修 戴尔笔记本郴州维修点 华硕笔记本维修点 郴州华硕笔记本维修 郴州笔记本上网维修
欢迎您,来自IP为:3.231.226.13 的朋友!您是第960629位访客; 其中 电脑访客746276位,手机访客214353位.当前在线人数1856位.最高记录是 1940