基础——数的进制
第1小节:二进制——正整数
前面的基础课,我们了解到:数据在程序运行时,需要放到内存里。并且知道,数据占用的最小内存空间是一个字节(Byte);而一个字节里面,又可以分成8位(bit)。这一节课,我们就从“位/bit”讲起。
建议阅读:《理解——什么是计算机语言》,了解为什么计算机采用二进制表达数据?等等相对基础的概念。
位/bit
“个位上1,表示1个1;十位上的1,表示1个10;百位上的1,表示1个100……”
小学课上,算术老师曾经这样语重心长地教过我们。今天,也让我心语心长一下,对于二进制,我们这样描述它的“位”:
0位上的1,表示1个1;
1位上的1,表示1个2;
2位上的1,表示1个4;
3位上的1,表示一个8;
……
现在请问:4位上的1,表示一个什么?
数学好一些的同学,可能脱口而出:16。为什么?因为16 = 2 * 2 * 2 * 2, 是2的4次方。还不够直观?
0位上的1,表示 2的0次方,即:1;(中学时学过:任何数的0次方值为1, 没忘记吧?)
1位上的1,表示 2的1次方,即:2;
2位上的1,表示 2的2次方, 即:4;
3位上的1,表示 2的3次方,即:8;
4位上的1,表示 2的4次方,即:16;
……
每一位上的1所表示的值,我们称为该位的“权”值。类似“科长、局长、部长”一样,同样是1,它的权越大,它的价值就越大?(思想有问题,请大家批斗我)。
(作业:请写出一个字节中,5~7位的权值表示)。
做一下10进制数与2进制数表达上的一些不同:
- 十进制数的位,通常从右到左这样称呼:个位,十位,百位,千位……
二进制数的位,从右到左,从0开始,依次向上称呼为:第0位,第1位,第2位……
- 十进制数的权值基数是10。所以个位为10的0次方(1),十位为十的1次方(10),百位为十的2次方(100)……
二进制数的权值基数是2,所以……
- 十进制数用到10个阿拉伯数,分别是:0、1、2、3、4、5、6、7、8、9,逢10进1。
二进制数用到2个阿拉伯数,分别是:0、1,逢2进1。
二进制换算成十进制
既然我们知道如何计算二进制数上各个位的权值,事实上也就等于知道如何把一个二进制数换算成十进制数了。比如:
例一
设有二进制数:01001000,换算成10进制数的过程:
(通常,为了不看花眼,通常我们把二进数按4个为一组,拆开看:0100 1000。)
3位上是1,表示2的3次方,得:8;
6位上是1,表示2的6次方,得:64;
8+64,得:72。
例二
让我们给出一个更完整的计算过程:
设有二进制数: 0110 0100, 要换算成十进制,让我们列一个竖式:
第0位 |
0 |
* |
20 |
= |
0 |
|
第1位 |
0 |
* |
21 |
= |
0 |
|
第2位 |
1 |
* |
22 |
= |
4 |
|
第3位 |
0 |
* |
23 |
= |
0 |
|
第4位 |
0 |
* |
24 |
= |
0 |
|
第5位 |
1 |
* |
25 |
= |
32 |
|
第6位 |
1 |
* |
26 |
= |
64 |
|
第7位 |
0 |
* |
27 |
= |
0 |
+ |
|
| |
|
|
|
|
100 |
|
因为0无论加以几次方的运算,结果仍为0,所以我们可以简化为:
1*22+1*23+1*25+1*26=100
没有理由你还不会这个换算过程吧?现场作业来了!
(作业:
请计算以下二进制数对应的的十进制值(不考虑负数的情况):
0000 0010 |
0000 0100 |
000 01000 |
000 10000 |
1000 0000 |
000 01010 |
)
十进制换算成二进制
给一个十进制数,比如:6,如果将它转换成二进制数呢?
10进制数转换成二进制数,这是一个连续除2的过程:
把要转换的数,除以2,得到商和余数,
将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果.
听起来有些糊涂?我们结合例子来说明。比如要将十进制的6换算二进制。
“把要转换的数,除以2,得到商和余数”。
要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 不要告诉我你不会计算6÷3 :(
“将商继续除以2,直到商为0……”
现在商是3,还不是0,所以继续除以2: 3 ÷ 2, 得到商是1,余数是1。
“将商继续除以2,直到商为0……”
现在商是1,还不是0,所以继续除以2: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1 ?)
“将商继续除以2,直到商为0……最后将所有余数倒序排列”
好极!现在商已经是0。
我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!
6转换成二进制,结果是110。
把上面的一段改成用表格来表示,则为:
| 被除数 |
计算过程 |
商 |
余数 |
| 6 |
6÷2 |
3 |
0 |
| 3 |
3÷2 |
1 |
1 |
| 1 |
1÷2 |
0 |
1 |
(6换算成2进制的计算过程)
÷ 看上去蛮可爱的,不过,在C/C++以及其它大多数计算机语言中,除法运算符采用 / 来表示。比如6除以2,写成C++语句就是: 6/2。也许你对这个斜杠的长相抱有成见,但能怎么办呢?在键盘上,并没有÷这个字符。
类似,乘号在C/C++语中,采用 * 来表示——虽然字母X看上去更像一个乘号。 |
难道我每次要换算时,都需要画一张表?我们在计算时,更通常的方法是画下面的图:

(6转换为二进制)
(作业:请大家立即动手,找纸找笔,用上图的方式,将十进制数6换算成二进制数)。
不管你有没有完成现场作业,现在,当有人提到110这个数时,你的脑海里不再应该仅仅想到巡警。
今天课程中只讲到正整数在十进制与二进制的互换。对于负整数,以与小数,如何在二者之间进行换算是相对复杂的内容。将在后面的课程中讲解。 |
作业:
1、将以下二进制数换算成十进制:
1110 0101 |
0000 1111 |
1111 0000 |
1111 1110 |
0000 0000 |
1111 1111 |
2、将以下十进制数,换算成二进制:
5 |
7 |
2 |
12 |
127 |
200 |
225 |
250 |
300 |
3、点击windows的“开始”按钮,选择程序菜单的“附件”菜单组,找到“计算器”。运行计算器后,选计算器程序的“视图”主菜单,确保选中“科学型”。然后学会使用该计算器来换算10进制整数与二进制之间的互相换算。并验算前面的作业。 |