在大屏或电脑上体验更佳——动画和操作区域更宽敞。
输入

二进制数

二进制用以 2 为底的位值表示整数。无符号八位字从左到右的权重是 128、64、32、16、8、4、2、1,范围为 0–255。

可以把它看成每轮只有 0、1 两个数字的里程表。最低轮满了就归零,并向左进位。最左轮也满时,没有第九轮接住进位;只保留八位便从零重新开始。因此本课既说明 77 如何编码,也说明八位无符号回绕为什么让 255 加 1 得到 0。

二进制如何工作

位值由位置决定。从右边的 0 开始编号,第 k 位权重为 2^k:第 0 位是 1,第 3 位是 8,第 7 位是 128。位为 1 就计入该权重,为 0 则贡献零。

读取 01001101,第 0、2、3、6 位为 1,因此数值是 1+4+8+64=77。

把数写成二进制时,用奇偶性提取最低位:除第 0 位外,其他位的权重都为偶数,因此 n % 2 恰好给出最低位。再做 n // 2,去掉最低位,让剩余位右移一个位置。重复到 n 为 0。余数按低位到高位产生,与纸面从左到右的书写顺序相反。

加 1 时,最低位若为 0,改成 1 就结束;若为 1,则清零并向左进位。连续的 1 都要清零,直到进位遇到 0。01111111 + 1 改写八位,01110000 + 1 只改一位。

逐步演示

默认把 n = 77 转成八位字。所有位初始为 0,循环从右向左填:

  1. 77 % 2 = 1,第 0 位写 1;77 // 2 = 38。
  2. 38 % 2 = 0,第 1 位写 0;38 // 2 = 19。
  3. 19 为奇数,第 2 位写 1,商为 9。
  4. 9 为奇数,第 3 位写 1,商为 4。
  5. 4 为偶数,第 4 位写 0,商为 2。
  6. 2 为偶数,第 5 位写 0,商为 1。
  7. 1 为奇数,第 6 位写 1,商为 0,循环结束。

第 7 位从未被循环访问,保留初始化的 0,得到 01001101。按位值读回:64+8+4+1=77。

切到 Decode,反向过程逐位扫描:第 0 位加 1,第 1 位不加,第 2 位加 4,第 3 位加 8,第 4、5 位不加,第 6 位加 64,第 7 位不加,最终为 77。两种转换可以互相核对。

Count 模式从 13(00001101)开始加四次 1:

  • 13→14:第 0 位清零,进位落在第 1 位,得到 00001110,改两位。
  • 14→15:最低位由 0 变 1,得到 00001111,改一位。
  • 15→16:第 0–3 位全清零,进位落在第 4 位,得到 00010000,改五位。
  • 16→17:最低位变 1,仍只改一位。

画布中的格子是字,各格上方是权重,下方游标标记当前读写位。账本同步记录除法、权重累加或增量,便于对照数值与位模式。

为什么八位最大是 255

八个位置各有两个选择,共 2⁸=256 种模式。从 0 开始对应 256 个值,最后是 255。11111111 的权重和为 128+64+32+16+8+4+2+1=255,比 256 少 1。

再加 1,每位都清零,进位越过第 7 位。没有第九位,丢弃进位后为 00000000。Odometer wrap 预设从 253 开始,先到 254、255,再回绕到零并在该处结束演示。字本身仍可继续计数。

这就是固定宽度无符号回绕的机制,可造成计数器归零、时间戳倒退或等级计数异常。增大宽度只能移动边界;若不允许回绕,应在增加前检查上限或使用检查型运算。截断后的字本身不报告丢失的进位,硬件状态位或检查型 API 则可以报告。

复杂度

W 位转换最多访问 W 位,时间为 O(W);固定八位时就是常数上限。单次递增最坏 O(W),进位可能穿过全部位。对全部 256 个起始模式取平均,每次递增翻转的位数略小于 2。

边界情况

  • n = 0 不进入转换循环,保留初始 00000000。
  • n = 255 要除八次,每位都写入。
  • 2 的幂只有一个 1,例如 64 是 2⁶,只设置第 6 位。
  • 解码 00000000 返回 0,不是错误。
  • 八位计数越过 255 后回到 0,位模式自身不会带着溢出提示。

常见错误

  • 按余数产生顺序从左到右写。低位先产生,高位却写在左边;把 01001101 镜像写成 10110010 会得到 178,而非 77。
  • 认为前导零由循环计算。77 只做七次除法,最高位来自初始化。若用字符串累积位,需要补齐宽度。
  • 从左边给第 0 位编号。八位字左端是第 7 位,右端才是第 0 位。
  • 期望本课八位结果保存 256。数学和为 256,但保留低八位后为 0。
  • 把翻转位数当成数值增量。15→16 改五位,14→15 改一位,数学增量都为 1;边界回绕另按模 256 解释。

模型范围

本课固定无符号八位字,以便在一行中展示位值、转换与进位。真实机器也使用 16、32、64 位等宽度,语言在边界处的行为不同。Python 整数可扩展,不按固定位宽回绕;C 无符号整数按类型宽度取模;Rust 在调试模式检查整数溢出并可能 panic,也提供显式回绕运算,参见 Rust 溢出规则。C 的有符号溢出属于未定义行为。负数还需编码约定,补码课会说明;不能把这里的无符号模型当成所有机器算术规则。