进制转换
进制转换学习编程,尤其是底层编程,免不了要接触到各种进制数(二进制/十进制/十六进制),以及它们之间的相互转换。
先看下表:
不难发现,它们之间是有规律可循的。
比如 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 次幂(方)。
知道这上边两条规律,对你平时开发调试程序是很有帮助的。
{:9_223:}
比如你看到二进制数 111111,立刻就知道对应的十进制数是 2^6-1,即 2 * 2 * 2 * 2 * 2 * 2 - 1 == 63
比如你知道为何调试程序的时候调试器总会将内存中的二进制数转换为十六进制 —— 因为恰好 8 位二进制数(一个字节)用 2 位十六进制数即可表示,非常节约空间。
上图是十六进制,下图是二进制:
二进制数和十进制数之间的相互转换
二进制 -> 十进制
从二进制数转换到十进制数,我们使用“按权相加”的方法。
什么是“权”?
所谓“权”,即“位权”!
比如说一个八位的二进制数 0010 1010,从右往左(←),每个位的“位权”依次是 01234567,如下图所示:
下边是公式:
十进制数 == 依次将每个二进制位的值 * 2的位权次方再相加
{:9_220:}
说人话就是,上边的二进制数 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
小甲鱼温馨提示:“按权相加”的方法适用于任何进制数到十进制数的转换。
二进制(补码)-> 十进制
上边的转换是对于无符号数来说的,如果万一摊上一有符号数,那转换就不是这么简单了……
当然,也不是那么复杂!
{:9_217:}
对于有符号数(补码)来说:
如果符号位为 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 了吧~
{:9_217:}
十进制 -> 二进制
从十进制数转换到二进制数,我们使用“辗转相除”的方法。不过我们这里不是要求最大公约数,而是取其余数。
即将待转换的十进制数不断地除以 2,直到商为 0,将每次除得的余数倒序拼凑起来,便是对应的二进制数……
好吧,No pic you say a J8:
{:9_234:} 尼玛上边这图我画了半个小时,强迫症害死人……
二进制数和十六进制数之间的相互转换
鉴于二进制和十六进制之间有着密不可分的暧昧关系,你只需要记住下边这个表格即可:
一旦遇到很多二进制数,你就从右往左,每四个为一组,查上表(其实用不了多久你就能记住它们间的对应关系了@_@)
一旦遇到十六进制数,你心里也有底了,不过就是把每个十六进制数拆解成 4 位二进制数嘛。
{:9_235:}
这还是需要计算呐,有木有更好的方法?!
有!回复“朕想知道”,教你最快速的转换方法:
**** Hidden Message *****
朕想知道 {:9_226:}真想知道 真想知道 朕想知道 {:7_112:}想知道 郑想知道
想知道。 朕想知道 朕想知道
支持小甲鱼
看看
朕想知道 郑想知道 不想知道:lol: 朕想知道
朕想知道{:9_240:} 支持!!! 学习学习 联想知道