进制与位运算速查
二进制、八进制、十六进制怎么换算、前缀怎么写、负数在计算机里是怎么表示的,以及位运算到底在算什么。
计算机内部只有两种状态,所以二进制是最底层的表示。但二进制写起来太长,于是有了八进制和十六进制作为「缩写」——它们能整块对应二进制位,转换时不需要做算术。
另一个必须理解的概念是负数与补码:计算机里没有减号,减法是用加一个「补数」实现的。理解补码,才能看懂位运算里那些看起来奇怪的结果。
1常见进制对照
同一个数值在不同进制下的写法不同。十六进制之所以流行,是因为一位十六进制恰好对应四位二进制。
| 十进制 | 二进制 | 八进制 | 十六进制 |
|---|---|---|---|
1 | 1 | 1 | 1 |
7 | 111 | 7 | 7 |
8 | 1000 | 10 | 8 |
10 | 1010 | 12 | A |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
255 | 11111111 | 377 | FF |
256 | 100000000 | 400 | 100 |
1000 | 1111101000 | 1750 | 3E8 |
十六进制用 `A` 到 `F` 表示 10 到 15。记住「`FF` = 255」和「`100` (十六进制) = 256」这两个值,在分析颜色代码、内存地址、字节数据时非常有用——它们正是「一个字节」和「两个字节」的最大值。
2各语言里的进制前缀
写常量时用前缀标明进制,是避免误解的标准做法。前缀在不同语言里高度统一。
| 进制 | 常见前缀 | 示例 | 说明 |
|---|---|---|---|
| 十六进制 | 0x 或 0X | 0xFF = 255 | 几乎所有编程语言一致 |
| 二进制 | 0b 或 0B | 0b1010 = 10 | 现代语言普遍支持,老语言可能不支持 |
| 八进制 | 0o 或前导 0 | 0o17 = 15 | 前导零写法在部分语言里已废弃,易与十进制混淆 |
| 无前缀十六进制 | 随场景而定 | 颜色代码 #FF0000、U+4E2D | 颜色、码点这类特定语境自带含义 |
| 八进制转义 | 反斜杠加数字 | 如字符串里的 \101 | 用在不便输入字符的场合,易与其他转义混淆 |
| 进制后缀 | 部分语言支持 | 如 16#FF | 较少见,主要出现在特定语言与配置格式中 |
「以 0 开头表示八进制」是很多老语言的坑:`010` 在一些语言里等于十进制的 8 而不是 10。写版本号、编号、前导零补位时尤其容易踩到,比如把「07 号」当成数字处理。
3位、字节与存储对应
二进制的每一位称为一个 bit,八位组成一个字节。理解这层对应关系有助于读懂存储与传输的数值。
| 项 | 含义 | 对应数值范围 |
|---|---|---|
| 1 bit | 一个二进制位 | 只能表示 0 或 1 |
| 1 字节(Byte) | 8 个 bit | 无符号可表示 0 到 255,有符号为 -128 到 127 |
| 1 个十六进制位 | 对应 4 个 bit | 取值范围 0 到 15 |
| 2 个十六进制位 | 对应 1 个字节 | 如 FF 是 255 |
| 1 KB(十进制) | 1000 字节 | 硬盘与网络常按此口径 |
| 1 KiB(二进制) | 1024 字节 | 操作系统内存与文件系统常按此口径 |
| 位运算的单位 | 按 bit 操作 | 因此常出现在权限标志、状态位等场景 |
4负数与补码
计算机里没有「负号」这种符号,负数是用补码表示的:最高位当符号位,负数的值等于「取反加一」。
| 表示法 | 规则 | 示例(8 位) |
|---|---|---|
| 原码 | 最高位为符号位,其余位表示绝对值 | -1 写作 10000001,且会出现 +0 与 -0 |
| 反码 | 负数在原码基础上除符号位取反 | -1 写作 11111110,同样有双零问题 |
| 补码(实际采用) | 负数等于其正数取反加一 | -1 写作 11111111,-128 写作 10000000 |
| 表示范围 | 8 位有符号数 | -128 到 127(负数多一个) |
| 减法变加法 | a - b 等价于 a + (-b) | 硬件只需实现加法器即可完成减法 |
| 溢出 | 超出范围时结果回绕 | 127 + 1 在 8 位有符号下变成 -128 |
「8 位有符号整数范围是 -128 到 127」这个不对称的边界就是补码的产物:因为零只有一种表示,多的那个编码被用来表示 `-128`。这也解释了为什么整数溢出时结果会突然变成很大的负数。
5常用位运算
位运算直接操作二进制位,常用于权限标志、开关状态与高性能场景。
| 运算符 | 名称 | 规则 | 典型用途 |
|---|---|---|---|
& | 按位与 | 两位都为 1 时结果为 1 | 取某几位、判断某个标志位是否开启 |
| | 按位或 | 任一位为 1 时结果为 1 | 设置某个标志位 |
^ | 按位异或 | 两位不同时结果为 1 | 切换标志位、不使用临时变量交换两个值 |
~ | 按位取反 | 每一位取反 | 配合掩码清除指定位 |
<< | 左移 | 整体左移,低位补零 | 相当于乘以 2 的幂 |
>> | 右移 | 整体右移 | 相当于除以 2 的幂(有符号数需注意符号扩展) |
| 组合用法 | 权限位 | 每个 bit 代表一项权限 | 如 1 读、2 写、4 执行,组合值即可表达权限集 |
权限位是最常见的位运算应用:用 `1 << n` 表示第 n 项权限,用 `|` 组合、用 `&` 判断是否包含。这样用一个整数就能表达多种权限组合,比存多个布尔值更紧凑,也是很多系统权限设计的底层方式。
看完就能用的站内工具
全部工具总览 →关于「进制与位运算速查」的常见问题
二进制、八进制、十六进制之间怎么换算?
三种进制与二进制之间存在整齐的分组对应关系,这是它们存在的意义。八进制的每一位对应三个二进制位(因为 2 的 3 次方等于 8),十六进制的每一位对应四个二进制位(2 的 4 次方等于 16)。所以转换时不需要做除法,直接分组对照即可:比如二进制 11111010,从右往左每四位一组得到 1111 和 1010,分别对应 F 和 A,所以十六进制是 FA;每三位一组得到 011 111 010,对应 3、7、2,所以八进制是 372。十进制与它们之间则要通过乘幂累加或除基取余来计算,用工具更省事。
计算机为什么用二进制?
根本原因是硬件实现简单可靠。电子元件最容易表达两种稳定状态(通电与断电、高电平与低电平),用二进制只需要区分这两种状态,抗干扰能力强、成本低。如果用十进制,硬件需要精确区分十种电平状态,在噪声环境下极易出错。二进制还有一个优势是逻辑运算天然对应布尔代数的真与假,使得逻辑电路的设计与化简有完整的数学工具支撑。代价是表示同样的数值需要更长的位数,所以人类读写时常用八进制或十六进制作为缩写,兼顾紧凑与易读。
为什么 8 位有符号整数范围是 -128 到 127,而不是对称的?
这是补码表示法的必然结果。在有符号整数里,最高位被用作符号位,8 位中只剩 7 位表示数值大小,理论上有 256 种编码。如果正负各占一半应该是 -127 到 127,但补码的设计里零只有一种编码(全零),多出来的那个编码就被分配给 -128,形成了 -128 到 127 这个不对称的范围。这样设计的最大好处是减法可以用加法实现:计算 a - b 时转成 a 加上 b 的补码,硬件只需要一个加法器。这个不对称还带来一个现象:-128 取相反数会溢出,因为它没有对应的正数。
Exel 的列号 A、Z、AA 是怎么和数字对应的?
Excel 的列名其实是「二十六进制」的变形,但要注意它没有零这个字符,所以不能直接用普通进制换算。规则是 A 对应 1、Z 对应 26,超过 Z 后进位变成 AA。换算时按位置加权:AA 表示 1 乘以 26 加 1 等于 27,AB 是 28,以此类推。反向换算则用不断除以 26 取余数的方式,但每次取余前要先减一,这样才能把 1 到 26 的范围映射到 A 到 Z。同样的思路也适用于把 IP 地址转成整数的场景(每段按 256 加权),理解了「按进制位置加权」这个统一原理,这类换算都能自己推导。
继续查:相关内容
全部速查 →内容说明:本页速查数据由本站自行整理,事实性内容以对应官方规范与文档为准,未复制第三方速查表或百科的表述。数据最后核对日期:2026-10-05。若发现错误或已更新的标准,欢迎通过页脚反馈入口告知。
速查在线工具箱