二进制

来自GSXAB的知识库
二进制
术语名称 二进制
英语名称 binary numeral system
别名 base-2 numeral system, binary
二进制的
术语名称 二进制的
英语名称 binary
别名 base-2, bin
二进制数
术语名称 二进制数
英语名称 binary numeral

二进制(binary, base-2, 缩写为 bin)记数系统指基数为 2进位制记数法。是指通过 0 和 1 两个符号表达数值的记数方法。

由于二进制及其运算与数字电路逻辑运算具有天然的匹配性,现代计算机系统中几乎全部在内部使用二进制进行计算。

请注意本文内容是基数为 2 的进位制记数系统。不是文件的一种类型,见二进制文件

定义

基数为 2 的进位制记数法称为二进制记数法(binary numeral system, base-2 numeral system, 简称 binary, base-2)。

二进制记数法下的数称为二进制数(binary numeral)。

二进制数中的一位(digit)即一个二进制位(binary digit, bit),简称比特,其位权为 2 的幂

类似地,“二进制系统相关的”往往使用二进制的(binary, 常缩写为 bin, 或 base-2)作为前缀。

表示

二进制中的每一位只含有 [math]\displaystyle{ 0 }[/math][math]\displaystyle{ 1 }[/math] 两个符号。在写成数形式时,遵从进位制记数法的一般规则,由权重更高的位到权重更低的位写成一串,且存在小数部分时在位权为 [math]\displaystyle{ 2^0=1 }[/math] 的位后添加小数点。如 [math]\displaystyle{ 1001100 }[/math]

若需要指出具体进制时,可使用一般的添加进制下标的形式,即 [math]\displaystyle{ 1001100_2 }[/math][math]\displaystyle{ (1001100)_2 }[/math] 。也有人使用缩写下标或后缀,即 [math]\displaystyle{ 1001100_\mathrm{bin} }[/math][math]\displaystyle{ 1001100\mathrm{b} }[/math]

编程语言,特别是受到 C 语言影响的编程语言中,二进制数通常加前缀 0b0B ,即 0b10011000B1001100

分隔符

由于二进制数通常有较多位数,有时对其使用类似千位分隔符的方式分段以便阅读。在通常情况下,由于二进制数以字节形式 8 位一组地出现,会按照每 4 位一段进行分隔。但是其他情况下,也可以 3 位一段分隔。如 [math]\displaystyle{ 100\ 1100 }[/math][math]\displaystyle{ 1\ 001\ 100 }[/math]

特别地,分隔本身也可以直接简写为十六进制八进制,这是因为 16 和 8 本身是 2 的幂,这使得二进制-十六进制混合进制和二进制-八进制混合进制都是 2 进制本身。如 [math]\displaystyle{ 4\mathrm{C}_{16} }[/math][math]\displaystyle{ 114_8 }[/math]

数值及表示

位权

对二进制数,其小数点前的数位(称为最低位(least significant bit, LSB))的位权为 1 ,向高位依次为 [math]\displaystyle{ 2,2^2,2^3,\cdots }[/math] ,其中权重最高的位称为最高位(most significant bit, MSB)。

如果存在小数部分,则向低位也依次为 [math]\displaystyle{ 2^{-1},2^{-2},2^{-3},\cdots }[/math]

二进制转换为十进制

计算一个二进制数的十进制表示时,可以通过计算对应位权相加的方式,即 [math]\displaystyle{ a_n 2^n + a_{n-1} 2^{n-1} + \cdots + a_1 2^1 + a_0 }[/math] ,也可以通过 Hornor 法则将其看作多项式求值 [math]\displaystyle{ ((\cdots(a_n x + a_{n-1}) x + \cdots + a_1) x + a_0) \mid_{x=2} }[/math]

注:实际上由于记数方式的改变并不会改变数值本身,这一方法中得到十进制表示只是因为通常的计算中所有数字都是用十进制表示的算法,所以自然得到了十进制表示下的结果。因此这一方法实际上可以适用于转换到任意进制,但由于需要将常规运算替换为该进制下 2 的幂以及加法乘法的算法计算,并不适合人工计算。

十进制转换为二进制

计算一个十进制数的二进制表示时有两种常见办法。

短除法:不断对 2 做带余除法,将余数作为得到的位,商继续循环,直到 0 为止。余数从最低位依次到最高位排列。

拆幂法:由于二进制的数字只会是 0 或 1 ,二进制表示相当于将数值直接拆分为几个不同的 2 的幂之和的方式,且可以直接通过比较大小的方式确认最高位位权。对较小的数,可以直接与 2 的幂进行比较,较大则拆出一个对应位上的 1 ,相减得到剩余部分。

二进制转换为八进制或十六进制

因为 16 和 8 本身是 2 的幂,这使得二进制-十六进制混合进制和二进制-八进制混合进制都是 2 进制本身。将一个二进制数按照位权为 1 的数位对齐的方式划分成 4 个(或 3 个)一组的形式,则新的形式就可以看成一个十六进制数(或八进制数),且其中每一位数都进一步地通过 4 位(或 3 位)二进制数表示。将这些二进制数表示对应地换成十六进制(或八进制)中的符号,就得到了对应整个数的十六进制(或八进制)表示。

八进制或十六进制转换为二进制

以上过程的逆过程,将十六进制数(或八进制数)每一位上的符号替换为 4 位(或 3 位)二进制数,就得到了一个被 4 位(或 3 位)分隔的二进制数。

一些常见数值表示

对有限小数,不列出其对应的无限循环小数形式。

整数(十进制) 整数(二进制) 分数(十进制) 小数(二进制)
1 1 1/1 1
2 10 1/2 0.1
3 11 1/3 [math]\displaystyle{ 0.\overline{01} }[/math]
4 100 1/4 0.01
5 101 1/5 [math]\displaystyle{ 0.\overline{0011} }[/math]
6 110 1/6 [math]\displaystyle{ 0.0\overline{01} }[/math]
7 111 1/7 [math]\displaystyle{ 0.\overline{001} }[/math]
8 1000 1/8 0.001
9 1001 1/9 [math]\displaystyle{ 0.\overline{000111} }[/math]
10 1010 1/10 [math]\displaystyle{ 0.0\overline{0011} }[/math]
11 1011 1/11 [math]\displaystyle{ 0.\overline{0001011101} }[/math]
12 1100 1/12 [math]\displaystyle{ 0.00\overline{01} }[/math]
13 1101 1/13 [math]\displaystyle{ 0.\overline{000100111011} }[/math]
14 1110 1/14 [math]\displaystyle{ 0.0\overline{001} }[/math]
15 1111 1/15 [math]\displaystyle{ 0.\overline{0001} }[/math]
16 10000 1/16 0.0001

二进制运算

请注意本文内容是基于二进制记数的数学上的数的运算。不是机器数,见原码反码补码的运算章节。不是位运算,见。

记数/后继

就是中文“二进制”一词得名的“逢二进一”。在最低位增加 1 ,如果达到 2 则进行进位(carry),由于该位实际变成了 10 两位数,将该位变为 0 并且在其更高一位增加 1 ,如果更高一位也达到 2 ,则也类似操作,直到不需要进位为止。

这一过程也可以描述为:反转从最低位开始所有连续的 1 ,然后将接下来的一位 0 反转为 1 。

加法

考虑一个二进制位之间的加法运算,有如下运算表。

+ 0 1
0 0 1
1 1 10

记这两个运算位为 [math]\displaystyle{ a_i,b_i }[/math] ,同一位上的和(sum)为 [math]\displaystyle{ s_i }[/math] ,进位(carry)为 [math]\displaystyle{ c_i }[/math] ,则有 [math]\displaystyle{ s_i = a_i \oplus b_i, c_i = a_i b_i }[/math] ,即分别为两个位的逻辑异或逻辑与。基于这一逻辑的数字逻辑电路称为半加器

二进制加法可以像十进制加法一样,通过加入来自下一位的进位,得到最终加和结果。

若加入来自下一位的进位,则对应的数字逻辑电路称为全加器

乘法

与十进制乘法类似,但由于乘数的所有数位都是 0 和 1 ,中间结果中只存在抄写被乘数和跳过数位两种情况。后续加法与普通二进制加法没有区别。

开方

二进制数可以竖式开平方,与十进制算法基本相同。


记数系统
位值制记数法 进位制记数法/标准位值制记数法(进制) 二进制八进制十进制十六进制、……
非标准位值制记数法 带符号进位制记数法/
平衡记数法(平衡进制)
平衡三进制、……
双射记数法(双射进制) 一进制双射十进制双射二十六进制、……
位权是幂
但基数不是自然数
(非自然数进制)
[math]\displaystyle{ -2 }[/math][math]\displaystyle{ -4 }[/math] 、……
[math]\displaystyle{ \sqrt{2} }[/math][math]\displaystyle{ \sqrt{3} }[/math][math]\displaystyle{ \sqrt[12]{2} }[/math] 、……
[math]\displaystyle{ 2i }[/math][math]\displaystyle{ \sqrt[4]{2}i }[/math][math]\displaystyle{ 2\omega }[/math][math]\displaystyle{ \sqrt[3]{2}\omega }[/math][math]\displaystyle{ -1\pm i }[/math] 、……
位权不是幂(混合进制 二五混合进制阶乘进制、……
其他 [math]\displaystyle{ p }[/math]-进数
质数记数法、……
符值制记数法 罗马记数法希腊记数法、……

琐事

历史

大部分进位值记数法都确立在进位值记数法的概念上代入不同基数而被发现,但二进制记数法则早于位值制概念,由莱布尼茨提出,并一同提出了二进制加减乘除及开方的算法。实际上成为了其逻辑理论的核心之一。