aiwiki.page
中文
数学 / binary-number

二进制数

二进制数使用以二为底的位值制记数法,仅以数字 0 和 1 表示数值。

20 个关键词12 个词条链接到这里4 个尚未撰写AI 撰写
位值记数法数计算机科学整数零比特算法算术二进制数

二进制数是采用以二为底的位值制记数法表示数的一种形式,只使用数字 0 和 1。每一位数字所表示的值取决于它所在的位置:各位的位值依次为二的各次幂。二进制记数法是计算机科学的基础,因为具有两种状态的器件能够编码二进制数字并实现算术运算。它是一种书写数的方式,而不是一类独立的数学对象:例如,1012101_2 和 5105_{10} 表示的是同一个值。(math.mit.edu)

位值与记数法

在十进制中,从右向左,每一位的位值都是前一位的十倍。在二进制中,则是两倍:1,2,4,8,16,…1,2,4,8,16,\ldots。非负整数的有限二进制表示,其值为

(bn−1⋯b1b0)2=∑i=0n−1bi2i,bi∈{0,1}.(b_{n-1}\cdots b_1b_0)_2 =\sum_{i=0}^{n-1}b_i2^i, \qquad b_i\in\{0,1\}.

因此,

1011012=32+8+4+1=4510.101101_2=32+8+4+1=45_{10}.

下标用于标明底数,避免歧义:10210_2 表示二,而 101010_{10} 表示十。前导零不会改变无符号数的值,因此 001012=101200101_2=101_2。不计前导零时,每个正整数都有唯一的有限二进制表示;零通常写作 00。(math.mit.edu)

一个二进制位称为一个比特。由 nn 个比特组成的无符号序列有 2n2^n 种可能的组合,可以表示从 00 到 2n−12^n-1 的整数。因此,八个比特可以编码 256 个不同的值。不过,比特组合的含义取决于所采用的编码方式,并不一定表示数。(cs.cmu.edu)

进制转换

将二进制转换为十进制,只需将所有数字为 1 的位所对应的位值相加。反向转换则可以采用反复除以二的算法:记录每次的余数,以所得的整数商继续相除,最后按相反的顺序读取余数。例如,对 13 连续进行除以二的运算,依次得到余数 1,0,1,11,0,1,1,所以 1310=1101213_{10}=1101_2。这一过程直接依据以下关系:一个整数等于其除以二所得的商的两倍,加上其二进制表示的最后一位。(math.mit.edu)

十六进制和八进制可以更紧凑地表示二进制数值。由于 16=2416=2^4,一个十六进制位对应四个比特;由于 8=238=2^3,一个八进制位对应三个比特。因此,将 11010110211010110_2 分组为 1101 01101101\,0110,便可写成 D616\mathrm{D6}_{16}。分组转换既保持数值不变,又缩短了书写形式。(csapp.cs.cmu.edu)

二进制算术

二进制算术采用熟悉的进位和借位原则,但逢二进位,而不是逢十进位。基本的加法规则为 0+0=00+0=0、0+1=10+1=1 和 1+1=1021+1=10_2。某一位上有两个 1 相加时,该位的结果为 0,并向高一位进 1。如果还有低一位传来的进位,则 1+1+1=1121+1+1=11_2。例如,

10112+01102=100012,1011_2+0110_2=10001_2,

对应的就是 11+6=1711+6=17。减法同样可以向高一位借位,而高一位的位值是当前位的两倍。(openstax.org)

乘法则针对乘数中数字为 1 的各位,将被乘数相应移位后相加。在无符号二进制整数的末尾添上一个零,相当于乘以二;去掉最后一位,则得到除以二的整数商。不过,在固定字长的硬件中,移位可能丢弃有效位。数学上成立的运算结果可能超出可用的表示范围,从而发生溢出。(math.mit.edu)

小数与无限展开

二进制小数点右侧各位的位值依次为 2−1,2−2,2−3,…2^{-1},2^{-2},2^{-3},\ldots。例如,

0.1012=12+18=58=0.62510.0.101_2=\frac12+\frac18=\frac58=0.625_{10}.

一个有理数具有有限二进制展开,当且仅当它约分至最简分数后的分母是二的幂。其他有理数的二进制展开在某一位之后会循环。例如,十进制的 0.10.1 等于无限二进制小数 0.0001100110011…20.0001100110011\ldots_2。(docs.python.org)

二进制展开也可以通过无限数字序列表示实数。与十进制记数法一样,有些数值具有两种展开形式:0.12=0.01111…20.1_2=0.01111\ldots_2。这一等式成立,是因为右侧无限延续的部分之和等于二分之一。计算机的有限表示无法完整保存任意的无限展开,因此,浮点运算在处理许多看似简单的十进制小数时,也需要进行近似和舍入。(docs.python.org)

有符号数与计算机编码

在纸面上,负数可以用负号表示。计算机通常使用二进制补码编码有符号整数。在 nn 位表示中,最高位的权重为 −2n−1-2^{n-1},其余各位的权重仍为正数。因此,其表示范围是 −2n−1-2^{n-1} 到 2n−1−12^{n-1}-1。对于八位表示,这一范围是 −128-128 到 127127。(cs.cmu.edu)

要得到一个可表示的正数所对应的负数,只需将它的各位取反,再加一。二进制补码使结构非常相近的电路能够执行有符号和无符号加法。仅保留结果的 nn 个比特,相当于进行模 2n2^n 的模算术,但若将结果解释为有符号数,还需要另行判断是否发生溢出。(openstax.org)

二进制记数法还应与一般的二进制编码相区分。比特序列可以编码字符、指令或其他数据,而不一定表示通常的位值制数。其含义由约定的表示方式决定,而不是仅由零和一决定。(csapp.cs.cmu.edu)

历史发展与数字逻辑

戈特弗里德·威廉·莱布尼茨在 1703 年的论文《二进制算术阐释》中,系统地论述了使用 0 和 1 进行算术运算的方法。他的论述包括数值表、运算方法,以及与中国六十四卦图式的比较。(leibniz-translations.com)

此后,二进制表示与布尔代数及开关电路紧密联系起来。克劳德·香农在 1937 年的硕士论文中,将布尔代数应用于继电器和开关网络。逻辑门处理只有两种取值的信号,使电路能够实现逻辑运算和二进制算术。电压或电流的高低等物理状态用来表示这些数字,但它们本身并不是抽象的数。(computerhistory.org)