在计算机中,使用二进制存储信息,为什么是二进制呢?
早期的计算机有3进制,还有5进制的,都是电驱动,用简单的电子元件来构建。电信号的电压来表征数字,如果是五进制,那么不稳定的电压,就会导致传输的信息的错误。二进制只有开和关(通电、断电)来表示两种状态,状态比较稳定 。
计算机中每一个0或1表示一个位,一个字节由8位组成,值域为 000000002 ~ 111111112 。如果看成十进制整数,它的值域就是 010 ~ 25510 ,但是这两种表示对于描述位模式都不太方便,二进制表示过于冗长,而十进制表示与位模式的转换很麻烦,所以我们可以用十六进制来表示位模式。十六进制使用数字 ‘0’ ~ ‘9’ 以及字母 ‘A’ ~ ‘F’ (字母也可以小写)来表示16个可能的值。用十六进制表示,一个字节的值域为 0016 ~ FF16 。
下表展示了16个十六进制数与十进制和二进制的对应关系。
十六进制数字 | 十进制值 | 二进制值 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
A | 10 | 1010 |
B | 11 | 1011 |
C | 12 | 1100 |
D | 13 | 1101 |
E | 14 | 1110 |
F | 15 | 1111 |
通常,我们认为以0x 或 0X 开头的数是十六进制的数。(注意:是“零x”)例如,我们可以将数字 AE4616 写成 0xAE46。接下来看看十六进制和二进制之间的转换。
比如,将0xAE46 转换成二进制表示,可以将十六进制数字的每一位进行展开:
十六进制 | A | E | 4 | 6 |
---|---|---|---|---|
二进制 | 1010 | 1110 | 0100 | 0110 |
这样,就得到了二进制表示 1010 1110 0100 0110 。
反过来,如果给定一个二进制数,可以将它分解为每4位一组,但是要注意如果位的总数不是4的倍数,最左边一组可以少于4位,前面用0补足,然后将每个组转换为相应的十六进制数字。
十进制和十六进制之间的转换需要使用乘法和除法来处理一般情况。将一个十进制数字 x 转换成十六进制数,可以不断的用 x 除以 16,得到一个商 q 和一个余数 r ,也就是 x = 16 * q + r 。然后用十六进制数字表示的 r 作为最低位,继续用 q 除以 16,直到 q 为 0 。
例如,十进制数 314156 的转换:
314156 = 16 * 19634 + 12 (C)
19634 = 16 * 1227 + 2 (2)
1227 = 16 * 76 + 11 (B)
76 = 16 * 4 + 12 (C)
4 = 16 * 0 + 4 (4)
可以看出转换后的十六进制数为 0x4CB2C 。
反过来,将十六进制数转换为十进制数,可以将十六进制数的每一位乘以对应的 16 的幂。例如 0x7AF, 计算7 * 162 + 10 * 161 + 15 * 160 = 1967 。
同理,十进制与其他进制数之间的相互转换都可以用上面的方法。