二进制(bit)整数

计算机以电子电荷集合的形式在内存中保存指令和数据。用数字来表示这些内容就需要系统能够适应开 / 关(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)提供了一种简便的方法来计算其十进制值:

dec = ( Dn-1 x 2n-1 ) + ( Dn-2 x 2n-2 ) +…+ ( D1 x 2)+ ( D0 x 2)

D 表示一个二进制数字。比如,二进制数 00001001 就等于 9。计算该值时,剔除了数字等于 0 的位:

( 1 X 23 ) + ( 1 X 20 ) = 9

下图表示了同样的计算过程:

无符号十进制整数到二进制数的转换

将无符号十进制整数转换为二进制,方法是不断将这个整数除以 2,并将每个余数记录为一个二进制数字。下表展示的是十进制数 37 转换为二进制数的步骤。余数的数字,从第二行开始,分别表示的是二进制数字D0
D1、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 为底的对数运算,但是有些网页可以帮助实现这种计算。

编程帮,一个分享编程知识的公众号。跟着站长一起学习,每天都有进步。

通俗易懂,深入浅出,一篇文章只讲一个知识点。

文章不深奥,不需要钻研,在公交、在地铁、在厕所都可以阅读,随时随地涨姿势。

文章不涉及代码,不烧脑细胞,人人都可以学习。

当你决定关注「编程帮」,你已然超越了90%的程序员!

编程帮二维码
微信扫描二维码关注