转换器

二进制转十进制:3 种方法详解与代码示例

学习使用三种方法将二进制转换为十进制:位置表示法、Double Dabble 算法和查表法。涵盖有符号二进制(二进制补码)、二进制小数、Python/JavaScript/C 代码实现,以及初学者常见错误。

发布于 2026年3月19日
13 分钟阅读
密码学指南

二进制转十进制:3 种方法详解与代码示例

二进制转十进制转换是计算机科学和数字电子学中最基础的技能之一。无论是调试网络数据包、读取传感器输出,还是备考计算机科学考试,你都需要在计算机使用的二进制语言和人类惯用的十进制系统之间灵活转换。

本指南将教你三种不同的二进制转十进制方法——从正式的位置表示法,到一种可以在几秒内心算 8 位数字的心算技巧。我们还涵盖有符号二进制(二进制补码)、二进制小数,以及三种编程语言的完整代码实现。你可以使用我们的免费二进制转十进制工具,边阅读边对下面的每个示例进行实操验证。

理解二进制数制

在学习转换方法之前,先了解二进制为何存在,以及它与十进制的关系,会大有裨益。

计算机为什么使用二进制

数字计算机由数十亿个晶体管构成,每个晶体管都像一个微型开关,具有两种状态:开和关。这两种状态与两个二进制数字(位)1 和 0 自然对应。虽然理论上可以用其他数制来构建计算机(三进制计算机曾被建造过),但二进制硬件要简单、廉价且可靠得多。你所接触的每一条数据——文本、图像、视频、音频——最终都以二进制数字序列的形式存储和处理。

位置表示法

二进制和十进制都是位置数制,这意味着每个数字的值取决于它所在的位置。在十进制中,每个位置代表 10 的幂次:

  • 347 = 3 × 10² + 4 × 10¹ + 7 × 10&sup0; = 300 + 40 + 7

在二进制中,每个位置代表 2 的幂次:

  • 1011 = 1 × 2³ + 0 × 2² + 1 × 2¹ + 1 × 2&sup0; = 8 + 0 + 2 + 1 = 11

你应当熟记的 2 的关键幂次值:

位置2 的幂次十进制值
02^01
12^12
22^24
32^38
42^416
52^532
62^664
72^7128
82^8256
92^9512
102^101,024
152^1532,768
162^1665,536
312^312,147,483,648

方法一:位置表示法(2 的幂次法)

这是标准教材中的方法,也是二进制转十进制最广泛教授的方式。

算法步骤

  1. 写下二进制数,每个数字占一列。
  2. 为每个位置标注 2 的幂次,从最右侧的 2^0 开始。
  3. 将每个位乘以对应的 2 的幂次值
  4. 将所有乘积相加,总和即为十进制值。

示例一:将 1101 转换为十进制

1101
位置3210
幂次值2^3=82^2=42^1=22^0=1
乘积8401

求和: 8 + 4 + 0 + 1 = 13

示例二:将 10110110 转换为十进制

10110110
位置76543210
幂次值1286432168421
乘积128032160420

求和: 128 + 0 + 32 + 16 + 0 + 4 + 2 + 0 = 182

示例三:将 1111111111111111(16 位全 1)转换为十进制

当所有位均为 1 时,结果为 2^n - 1,其中 n 为位数:

2^16 - 1 = 65,536 - 1 = 65,535

这是无符号 16 位整数的最大值,在网络编程中很常见(端口号范围为 0 到 65,535)。

适用场景

位置表示法最适合:

  • 正式笔头作业和考试
  • 较短的二进制数(手算不超过约 8 位)
  • 理解数学基础
  • 向他人讲解和演示概念

方法二:Double Dabble(倍增法)

Double Dabble 方法是一种从左到右处理二进制数的心算技巧。它无需计算或记忆较大的 2 的幂次值。

算法步骤

  1. 从最左侧(最高有效位)开始。
  2. 将累计总数初始化为第一位的值(0 或 1)。
  3. 对于每个后续位:将累计总数加倍,再加上当前位的值。
  4. 处理完最后一位后,累计总数即为十进制值。

示例一:将 11010 转换为十进制

步骤操作累计总数
1从位 1 开始1
2加倍 + 位 12 + 1 = 3
3加倍 + 位 06 + 0 = 6
4加倍 + 位 112 + 1 = 13
5加倍 + 位 026 + 0 = 26

结果: 11010 = 26

示例二:将 10110011 转换为十进制

步骤操作累计总数
1从位 1 开始1
2加倍 + 位 02 + 0 = 2
3加倍 + 位 14 + 1 = 5
4加倍 + 位 110 + 1 = 11
5加倍 + 位 022 + 0 = 22
6加倍 + 位 044 + 0 = 44
7加倍 + 位 188 + 1 = 89
8加倍 + 位 1178 + 1 = 179

结果: 10110011 = 179

原理解析

将累计总数加倍,在数学上等价于将之前处理过的所有位向左移动一个位置(即乘以 2)。加上新的位,就是将它放入个位。这复现了位置表示法的计算过程,却无需显式计算任何 2 的幂次值。

用代数表示,对于二进制数 b3 b2 b1 b0:

  • 开始:b3
  • 第 2 步:2×b3 + b2
  • 第 3 步:2×(2×b3 + b2) + b1 = 4×b3 + 2×b2 + b1
  • 第 4 步:2×(4×b3 + 2×b2 + b1) + b0 = 8×b3 + 4×b2 + 2×b1 + b0

这与位置表示法的公式完全一致。

适用场景

Double Dabble 最适合:

  • 心算(无需纸笔或计算器)
  • 较长的二进制数(逐一追踪 2 的幂次值太繁琐)
  • 调试或面试时的快速转换
  • 按顺序处理位的场景(如读取串行接口数据)

方法三:查表法

对于经常遇到的值,查表法可以免去任何计算,直接得出结果。

快速参考:2 的幂次

二进制十进制
11
102
1004
10008
1000016
10000032
100000064
10000000128
100000000256

常见 8 位值

二进制十进制含义
000000000零 / 空字节
000000011最低位置位
0000101010换行符(LF)
0010000032ASCII 空格字符
0010101042生命之答(《银河系漫游指南》)
0100000165ASCII 大写字母 'A'
0110000197ASCII 小写字母 'a'
01111111127有符号 8 位最大值 / ASCII DEL
10000000128最高位置位 / 有符号 8 位最小值(-128)
11000000192C 类网络地址
11111111255无符号 8 位最大值 / 广播地址

适用场景

查表法最适合:

  • 经常遇到的值(ASCII 码、子网掩码、常用常量)
  • 考试或面试时的快速参考
  • 建立二进制模式与十进制值的直觉对应
  • 验证其他两种方法的计算结果

如需涵盖全部 256 个字节值的完整交互式表格,请访问我们的二进制转十进制工具

有符号二进制:二进制补码转换

无符号二进制只能表示非负值。为了表示负数,现代计算机普遍采用二进制补码

二进制补码的工作原理

在 n 位二进制补码系统中:

  • 若最高有效位(最左侧位,MSB)为 0,则该数为正数——按普通方式读取即可
  • 若 MSB 为 1,则该数为负数——按以下步骤处理

解码负数二进制补码:

  1. 注意该数为负数(MSB = 1)
  2. 将所有位取反(0 变 1,1 变 0)
  3. 将结果加 1
  4. 将结果转换为十进制,并在前面加负号

示例:将 8 位有符号二进制 11101100 转换为十进制

  1. MSB 为 1,因此该值为负数
  2. 取反:11101100 → 00010011
  3. 加 1:00010011 + 1 = 00010100
  4. 将 00010100 转换为十进制:16 + 4 = 20
  5. 加负号:-20

示例:将 8 位有符号二进制 01010110 转换为十进制

  1. MSB 为 0,因此该值为正数
  2. 按普通方式转换:64 + 16 + 4 + 2 = 86

二进制补码范围

位数无符号范围有符号范围
80 到 255-128 到 127
160 到 65,535-32,768 到 32,767
320 到 4,294,967,295-2,147,483,648 到 2,147,483,647
640 到 18.4 × 10^18-9.2 × 10^18 到 9.2 × 10^18

二进制补码的优势在于,在硬件层面加减法对有符号和无符号数的处理方式完全相同,从而简化了 CPU 设计。

二进制小数:小数点后部分的转换

二进制数可以包含小数部分,以二进制小数点分隔(类似于十进制小数点)。小数点后的数字代表 2 的负幂次。

小数位置值

位置幂次十进制值
-12^(-1)0.5
-22^(-2)0.25
-32^(-3)0.125
-42^(-4)0.0625
-52^(-5)0.03125
-62^(-6)0.015625

示例:将 110.101 转换为十进制

整数部分(110):

  • 1 × 4 + 1 × 2 + 0 × 1 = 6

小数部分(.101):

  • 1 × 0.5 + 0 × 0.25 + 1 × 0.125 = 0.625

总计: 6 + 0.625 = 6.625

示例:将 1.001 转换为十进制

  • 1 × 1 = 1
  • 0 × 0.5 = 0
  • 0 × 0.25 = 0
  • 1 × 0.125 = 0.125

总计: 1 + 0 + 0 + 0.125 = 1.125

精度问题

并非所有十进制小数都能精确表示为二进制。例如,十进制 0.1 的二进制表示是无限循环小数 0.0001100110011……这就是为什么在大多数编程语言中 0.1 + 0.2 不等于 0.3——二进制表示需要舍入,从而引入微小误差。这一限制是二进制浮点数表示法(IEEE 754)的固有特性,并非任何特定语言的缺陷。

编程示例

Python

# 基本转换
binary_str = "10110011"
decimal_value = int(binary_str, 2)
print(decimal_value)  # 179

# 二进制字面量
x = 0b10110011
print(x)  # 179

# 将十进制转回二进制
print(bin(179))       # '0b10110011'
print(f"{179:08b}")   # '10110011'(补齐至 8 位)

# 二进制补码(有符号)
def signed_binary(binary_str, bits=8):
    """使用二进制补码将有符号二进制字符串转换为十进制。"""
    value = int(binary_str, 2)
    if value >= 2**(bits - 1):
        value -= 2**bits
    return value

print(signed_binary("11111001"))   # -7
print(signed_binary("10000000"))   # -128
print(signed_binary("01111111"))   # 127

# 二进制小数
def binary_fraction_to_decimal(binary_str):
    """将含可选小数部分的二进制字符串转换为十进制。"""
    if '.' in binary_str:
        integer_part, frac_part = binary_str.split('.')
        result = int(integer_part, 2) if integer_part else 0
        for i, bit in enumerate(frac_part):
            if bit == '1':
                result += 2 ** -(i + 1)
        return result
    return int(binary_str, 2)

print(binary_fraction_to_decimal("101.11"))   # 5.75
print(binary_fraction_to_decimal("1.001"))    # 1.125

JavaScript

// 基本转换
const binaryStr = "10110011";
const decimal = parseInt(binaryStr, 2);
console.log(decimal);  // 179

// 二进制字面量
const x = 0b10110011;
console.log(x);  // 179

// 将十进制转回二进制
console.log((179).toString(2));             // '10110011'
console.log((179).toString(2).padStart(8, '0')); // '10110011'

// 二进制补码(有符号)
function signedBinary(binaryStr, bits = 8) {
  let value = parseInt(binaryStr, 2);
  if (value >= 2 ** (bits - 1)) {
    value -= 2 ** bits;
  }
  return value;
}

console.log(signedBinary("11111001"));   // -7
console.log(signedBinary("10000000"));   // -128
console.log(signedBinary("01111111"));   // 127

// 处理超大二进制数时使用 BigInt
const bigBinary = "1111111111111111111111111111111111111111";
const bigDecimal = BigInt("0b" + bigBinary);
console.log(bigDecimal.toString());  // '1099511627775'

C

#include <stdio.h>
#include <string.h>

// 将二进制字符串转换为十进制(无符号)
unsigned long binaryToDecimal(const char *binary) {
    unsigned long decimal = 0;
    int len = strlen(binary);
    for (int i = 0; i < len; i++) {
        decimal = decimal * 2 + (binary[i] - '0');
    }
    return decimal;
}

// 将二进制字符串转换为有符号十进制(二进制补码)
long signedBinaryToDecimal(const char *binary, int bits) {
    unsigned long value = binaryToDecimal(binary);
    if (value >= (1UL << (bits - 1))) {
        value -= (1UL << bits);
    }
    return (long)value;
}

int main() {
    printf("%lu\n", binaryToDecimal("10110011"));  // 179
    printf("%lu\n", binaryToDecimal("11111111"));   // 255

    printf("%ld\n", signedBinaryToDecimal("11111001", 8));  // -7
    printf("%ld\n", signedBinaryToDecimal("10000000", 8));  // -128
    printf("%ld\n", signedBinaryToDecimal("01111111", 8));  // 127

    return 0;
}

注意,C 语言的 binaryToDecimal 函数内部使用了 Double Dabble 算法:decimal = decimal * 2 + (binary[i] - '0') 正是「将累计总数加倍,再加上当前位」的精确实现。

常见错误

错误一:从左到右读取位位置

最右侧的位是位置 0,而非最左侧的位。二进制 1000 是 8(2^3),而不是 1。始终从右到左计算位置。

错误二:忘记位置 0 等于 1 而非 0

最右侧的位代表 2^0 = 1,而不是 0。学生有时从 1 而非 0 开始计算幂次,导致每个值恰好是正确答案的一半。

错误三:将有符号二进制当作无符号处理

8 位二进制 10000001,作为无符号数是 129,作为有符号数(二进制补码)则是 -127。始终明确你使用的是有符号还是无符号解释。在大多数编程上下文中,int 类型默认为有符号。

错误四:假设所有十进制小数都有精确的二进制表示

十进制 0.1 无法用二进制精确表示——它会变成无限循环小数(0.0001100110011……)。这就是为什么在 JavaScript、Python、C 及几乎所有其他语言中 0.1 + 0.2 !== 0.3。当精度至关重要时,请使用整数运算(用分表示金额而非用元)或专用的十进制类型。

错误五:混淆外形相似的二进制数和十进制数

二进制 1000(= 十进制 8)和十进制 1000(一千)外观完全相同,但代表的值相差悬殊。始终明确标注数制,尤其是在与他人交流时。在代码中使用前缀:0b1000 表示二进制,普通 1000 表示十进制。

错误六:固定位宽下的溢出问题

一个 8 位无符号变量只能存储 0 到 255。对 255(11111111)加 1 会溢出为 0(00000000)。对于有符号 8 位,对 127(01111111)加 1 会溢出为 -128(10000000)。始终检查你的位宽是否能容纳预期的值域范围。

错误七:混淆二进制和 BCD 编码

二进制与二进制编码十进制(BCD)对同一个数字产生不同的位模式。十进制 42 的标准二进制是 101010(6 位),而在 BCD 中是 0100 0010(8 位,每个十进制数字单独用 4 位编码)。BCD 的空间效率较低,但能保留精确的十进制数字表示,因此出现在某些金融和显示硬件中。

二进制转十进制的实际应用

理解二进制转十进制转换不仅仅是学术练习。以下是这一技能直接派上用场的最常见场景。

网络工程

IP 地址(如 192.168.1.0)在内部以 32 位二进制数的形式存储。子网划分需要在二进制子网掩码与其十进制等价值之间相互转换。例如,子网掩码 255.255.255.0 的二进制表示为 11111111.11111111.11111111.00000000——理解这种二进制模式对于计算地址的网络部分和主机部分至关重要。

嵌入式系统与物联网

微控制器和传感器常以二进制寄存器值进行通信。当读取一个 8 位 ADC(模数转换器)时,你会收到类似 10110100 的二进制值,需要将其转换为十进制电压读数(255 中的 180,对应一个比例电压)。调试接口经常以二进制形式显示内存内容,工程师必须对其进行解读。

调试与逆向工程

在调试底层软件时,内存转储、核心文件和寄存器状态以二进制或十六进制显示。将这些值转换为十进制有助于理解实际存储的值。同样,分析二进制文件格式、网络协议或加密数据,都需要熟练掌握二进制转十进制的转换。

计算机科学教育

二进制转十进制转换是一个入门主题,是理解 CPU 架构、内存寻址、布尔代数和数字逻辑设计的基础。掌握这一转换,为汇编语言、操作系统和计算机网络等后续主题奠定基础。

常见问题

如何将二进制 1010 转换为十进制?

二进制 1010 = (1 × 8) + (0 × 4) + (1 × 2) + (0 × 1) = 8 + 0 + 2 + 0 = 10。这是一个常用示例,因为二进制 1010 恰好转换为整数十进制 10,便于记忆。

心算二进制转十进制最快的方法是什么?

使用 Double Dabble 方法:从最左侧的位开始,向右依次将累计总数加倍并加上当前位。例如,1101:从 1 开始,加倍+1=3,加倍+0=6,加倍+1=13。无需记忆 2 的幂次值。

8 位能表示的最大数是多少?

无符号 8 位:11111111 = 255(2^8 - 1)。有符号 8 位(二进制补码):01111111 = 127(2^7 - 1)。有符号范围是 -128 到 127,共 256 个值。

二进制与十六进制有什么关系?

每个十六进制数字恰好代表 4 个二进制位(因为 16 = 2^4)。因此,二进制 11111111 = 十六进制 FF(十进制 255),二进制 10101010 = 十六进制 AA(十进制 170)。十六进制被广泛用作二进制的紧凑简写。有关十六进制转二进制,请参见我们的十六进制转二进制工具

二进制与八进制有什么关系?

每个八进制数字恰好代表 3 个二进制位(因为 8 = 2^3)。二进制 111111111 = 八进制 777(十进制 511)。八进制用于 Unix 文件权限(chmod)。更多详情请参见我们的二进制转八进制工具

为什么使用二进制补码而非符号-数值表示法?

与符号-数值表示法(MSB 仅作为正负标志)相比,二进制补码有两个关键优势:(1)零只有唯一的表示(符号-数值中,00000000 和 10000000 都等于零);(2)正数和负数的加减法使用同一套硬件电路,简化了 CPU 设计。

能将很长的二进制数转换为十进制吗?

可以,相同的方法适用于任意长度。对于大数的心算,Double Dabble 方法的扩展性很好。在编程中,Python 原生支持任意精度整数,JavaScript 提供 BigInt,C 则有 GMP 等任意精度运算库。

什么是二进制编码十进制(BCD)?

BCD 是一种不同的编码方式,每个十进制数字单独用 4 个二进制位表示,而非对整个数字进行转换。例如,十进制 42 在 BCD 中是 0100 0010(4 = 0100,2 = 0010),而不是 101010(这才是标准二进制的 42)。BCD 用于某些金融和显示应用场合,这些场合需要精确保留十进制数字表示。

小结

二进制转十进制转换建立在位置表示法的基础上:每个位位置代表 2 的一个幂次。根据场合不同,你可以选择三种方法来完成转换:

  1. 位置表示法——正式方法。将每位乘以对应的 2 的幂次值后求和。适合书面作业和较短的数字。
  2. Double Dabble——心算技巧。从左到右依次加倍并累加。适合快速心算和较长的数字。
  3. 查表法——对常见值(如 ASCII 码、子网掩码、字节边界)直接查表,无需计算。

对于有符号二进制,使用二进制补码:若 MSB 为 1,则将所有位取反、加 1,再取负。对于二进制小数,将位置表示法扩展到 2 的负幂次即可。

准备好实践了吗?使用我们的免费二进制转十进制工具,对任意二进制数——无符号、有符号或小数——进行转换,并获得逐步分解和即时验证。

关于本文

本文是我们综合 转换器 教程系列的一部分。继续了解古典密码学,并探索我们的交互式密码工具。

更多 转换器 教程

试用 转换器 工具

通过我们的交互式转换器工具,将所学知识付诸实践。

试用 转换器 工具