跳到主要内容
CalcMax

二进制转十六进制换算器

结果

B2

十六进制

每四位一组
1011 0010

二进制转十六进制换算器把用二进制写的数改写成同一个数的十六进制写法,而这是这一组里最省力的一个换算,因为这里其实没有计算:一个十六进制位正好装四个二进制位,所以整件事就是把二进制串从右往左按四位切开,每一段读成一个数字。10110010 切成 1011 和 0010,分别读作 B 和 2,于是答案是 B2。这条四对一的固定关系,就是十六进制存在的理由——一个字节是八位,所以正好两位十六进制;一个十六位地址正好四位——也是写机器码、颜色值和内存地址的人用这个进制而不是二进制的缘故。页面把用到的分组印在答案下面,因为分组本身就是这个换算。如果位数不是四的倍数,最左边那一段要补零补到四位:10110 变成 0001 0110,也就是 16。这些零不改变值,只改变分组。

全部十六种四位组,以及每一种所对应的十六进制数字

四位组十六进制位十进制
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
1010A10
1011B11
1100C12
1101D13
1110E14
1111F15

整个换算就写在这里了。所有可能的四位组各出现一次,所以用的时候不需要现算——这张表是闭的,扫过一遍的人就能把任何二进制串按四位切开、逐段读出来。它是固定的,不是从上面的输入推出来的,所以数字变了它不变;两者看起来对不上时也不矛盾:面板回答你输入的那个数,表回答一个更一般的问题——这十六种四位组各是什么。中间那一列向下读是没有缺口地从 0 数到 F,这正是要点——字母不是编码,而是数字过了九之后的延续。第一列向下读,二进制也是按同样的步长往上走,对应关系因此是机械的。表停在 1111,因为一位十六进制到那里为止:再往上的值需要第二位,而那就是页面上面已经做过的重新分组。

公式

10110010 = 1011 0010 = B2

二进制
要改写的那个数,用二进制写。换算不会改变它的值——同一个数换一套数字符号写出来而已
四位组
四个二进制位凑成的一段。它是这个换算的工作单位,而四个位能凑出正好十六种组合,这正是十六进制与二进制配对的原因
0-9、A-F
十六个十六进制数字,一位一个。其中十个是熟悉的阿拉伯数字,剩下六个借用字母 A 到 F,表示十到十五
补零
位数不是四的倍数时,在最左边那一段的左边添的零。它们改变的是分组,绝不改变值,所以 10110 与 00010110 是同一个数的两种写法
从右往左
切分的方向。分组从最右端开始凑,因为个位在那一头,和十进制里从右往左数三位一节是同一个道理
53 位
输入最长可以是多少位:五十三个二进制位,也就是 9007199254740991,换到另一头是十四位十六进制数。这是机器没法再区分相邻整数的宽度,更长的输入会被拒绝而不是四舍五入

这是人们最常在做、却往往不把它当成换算的那一个。在调试器里读一个字节、核对一个颜色值、算子网掩码、看一段哈希的前缀、读设备寄存器的转储、比较日志里两个标志位,都是位本身才是真相、而十六进制是它们被印出来的形式的场合——在两种视角之间来回走,是底层工作里的日常。两个方向都用得上:数据手册给出的是寄存器的十六进制值,要检查的那一位靠把它展开得到;而示波器上的波形或者一道关于位模式的题目拿到手是二进制,要写成文档里用的那个形式。学生遇到它,则是因为它让长二进制串变得可以对付:十六位的二进制串没法读,而它的四位十六进制可以,知道这层关系是四对一而不是要去算的,就省掉了全部运算。页面把分组印出来,是为了让这条捷径看得见而不是靠宣告——这既让它能替代一次手算,也能用来核对一次手算。

算例

  1. 改写 10110010

    1. 从右往左把串按四位切开:1011 和 0010
    2. 读第一段:1011 是 8 + 2 + 1 = 11,也就是 B
    3. 读第二段:0010 是 2,也就是 2
    4. 两位合起来得到 B2

    默认算例,而且正好是一个字节,所以切出来是齐的。B2 就是这个值在调试器或数据手册里的样子——底下那八位还在,所以页面把分组印在答案旁边而不是留在心里。

  2. 单独一段,1111

    1. 四个数字正好就是一段
    2. 1111 是 8 + 4 + 2 + 1 = 15
    3. 十五在十六进制里写作 F
    4. 答案是一个数字,F

    最大的一段,也是能看出字母为什么到此为止的一次:十五是四位能装的最大值,所以 F 是这个进制里最后一个数字。再宽的值没法用一位十六进制写出来,而这正是被利用的那条性质。

  3. 补零:10110

    1. 五位没法整除成四,所以从右往左切:0110 凑成完整的一段
    2. 左边多出一个数字,把它补到四位:0001
    3. 0001 是 1,0110 是 6,两位合起来是 16
    4. 页面显示的分组是 0001 0110,比输入长两位

    看着像出错、其实没错的那一格。输出比分组长,是因为一个十六进制位就是四位宽,最后一段必须补到那个宽度。10110 与 00010110 是同一个数,而补零正是让第二个数字读得出来的前提——不补的话,落单的那一个位没有东西可以对应。

  4. 负值,-10110

    1. 负号在数外面,先放到一边,换算 10110
    2. 10110 重新分组为 0001 0110,读作 16
    3. 把符号放回两个读数:-16

    两个输出上的符号都留在数字外面。折进去需要先有一个固定宽度,而这里没有——处理器把这个值存进八个位,写出来的那串 0 和 1 完全取决于宽度是八这件事。十六进制读数保留符号,理由与二进制那边一样。

局限

本页只改写整数形式的二进制数。没有二进制小数点,所以小数输入会被拒绝而不是换算,也不会产生十六进制小数。输入最长五十三个二进制位,也就是十进制 9007199254740991,换到另一头是十四位十六进制数;更长的值机器存不精确,会被拒绝而不是给个近似值。输入里的前导零会被接受并忽略,但分组补出来的零是特意显示的——补过零的输出比输入宽是有意的,不是错误。前面带负号会被接受,并带到两个输出上。只处理整数,所以这是一次读数换算而不是运算:在两种进制下做加减乘除在下面链接的计算页上,而反方向、从十六进制回到二进制,有它自己的一页。

常见问题

为什么输出比我输入的长?
因为一个十六进制位正好四位宽,最左边那一段必须补到那个宽度。像 10110 这样的五位输入,是一个完整的四位组(0110)加上一个落单的数字,而落单的那一个要在左边补成 0001。这些零不改变值——10110 与 00010110 是同一个数——而补零正是让最后一段有东西可以对应。不补的话,落单的那一个位在表里找不到自己的位置。
这个换算里需要做运算吗?
不需要,而这正是有意思的地方。因为十六是二的幂,两种进制的边界正好落在每四个二进制位处,所以换算是重新分组而不是计算。没有乘法、没有加法、也没有进位;把数字按四位切开,逐段查表就行。这就是十六进制被用来做紧凑写法的原因,也是页面把分组印在答案旁边的原因:分组这个方法是被展示出来的,而不是被描述出来的。
为什么一位十六进制等于四位,而不是三位或五位?
因为四位能装下正好十六种不同的值,而一个十六进制数字正好有十六个符号。三位只有八种,所以八进制配三位;五位有三十二种,没有哪个常用进制用它。对应关系必须严丝合缝,重新分组才不需要任何进位,而只有二的幂能做到这一点。一个字节是八位、因此正好两位十六进制,也是同一个道理。
最长能换算多长的二进制数?
五十三个二进制位,换成十进制是 9007199254740991,换算之后是十四位十六进制数。这条上界来自机器精确表示整数的能力,不是本页自定的规矩:再宽下去相邻的整数就区分不开了,更长的输入没法忠实换算。它会带着说明被拒绝而不是四舍五入,这一点在这里尤其要紧,因为一个被舍入的答案看起来会是一个完全正常的十六进制值。
带小数的二进制数能换算吗?
这一页不行。这里不收二进制小数点,也不会产出十六进制小数,因为小数的换算需要额外决定保留几位、最后一位怎么舍入。这一组页面一律只处理整数,所以同一个输入不会在这里被接受、在别处被拒绝。在这条界线之内,换算是精确的:任何不超过长度上限的整数二进制数都对应唯一一个十六进制值,中间没有任何舍入。
答案里的大小写有讲究吗?
答案一律用大写印出——B2 而不是 b2——但两者是同一个值,到哪里都认得。文档、反汇编和数据手册几乎都用大写,而 CSS 的颜色值习惯写小写,所以从哪一边来的人看到的都是熟悉的形式。这一页印大写,是为了与这一族的其他页保持一致,也是因为与它常一起出现的那些材料用的就是这个约定。

参考资料

相关计算器