计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能够适应开 / 关(on/off)或真 / 假(true/false)的概念。
二进制数(binary number)用 2 个数字作基础,其中每一个二进制数字(称为位,bit)不是 0 就是 1。
位自右向左,从 0 开始顺序增量编号。左边的位称为最高有效位(Most Significant Bit, MSB)右边的位称为最低有效位(LSB, least significant bit)。一个 16 位的二进制数,其 MSB 和 LSB 如下图所示:
二进制整数可以是有符号的,也可以是无符号的。有符号整数又分为正数和负数,无符号整数默认为正数,零也被看作是正数。
在书写较大的二进制数时,有些人喜欢每 4 位或 8 位插入一个点号,以增加数字的易读性。比如,1101.1110.0011.1000.0000 和 11001010.10101100
从 LSB 开始,无符号二进制整数中的每一个位代表的是 2 的加 1 次幂。下图展示的是对一个 8 位的二进制数来说,2 的幂是如何从右到左增加的:
下表列出了从 20 到 215 的十进制值。
2ⁿ | 十进制值 | 2ⁿ | 十进制值 |
---|---|---|---|
20 | 1 | 28 | 256 |
21 | 2 | 29 | 512 |
22 | 4 | 210 | 1024 |
23 | 8 | 211 | 2048 |
24 | 16 | 212 | 4096 |
25 | 32 | 213 | 8192 |
26 | 64 | 214 | 16384 |
27 | 128 | 215 | 32768 |
对于一个包含 n 个数字的无符号二进制整数来说,加权位记数法(weighted positional notation)提供了一种简便的方法来计算其十进制值:
D 表示一个二进制数字。比如,二进制数 00001001 就等于 9。计算该值时,剔除了数字等于 0 的位:
下图表示了同样的计算过程:
将无符号十进制整数转换为二进制,方法是不断将这个整数除以 2,并将每个余数记录为一个二进制数字。下表展示的是十进制数 37 转换为二进制数的步骤。余数的数字,从第二行开始,分别表示的是二进制数字D0D1、D2、D3、D4 和 D5:
除法 | 商 | 余数 | 除法 | 商 | 余数 |
---|---|---|---|---|---|
37/2 | 18 | 1 | 4/2 | 2 | 0 |
18/2 | 9 | 0 | 2/2 | 1 | 0 |
9/2 | 4 | 1 | 1/2 | 0 | 1 |
将表中余数列的二进制位逆序连接(D5,D4,…),就得到了该整数的二进制值 100101。由于计算机总是按照 8 的倍数来组织二进制数字,因此在该二进制数的左边增加两个 0,形成 00100101。
提示:有多少位呢?设无符号十进制值为 n,其对应的二进制数的位数为 b,用一个简单的公式就可以计算出 b : b = (log2n) 的上限。比如,如果 n=17,则 log217 = 4.087 463,取其上限的最小整数 5。大多数计数器没有以 2 为底的对数运算,但是有些网页可以帮助实现这种计算。