教程 - 软件 - 文章 - 论坛

::白话C++::

基础——数的进制

第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进制数表达上的一些不同:

  1. 十进制数的位,通常从右到左这样称呼:个位,十位,百位,千位……
    二进制数的位,从右到左,从0开始,依次向上称呼为:第0位,第1位,第2位……
  2. 十进制数的权值基数是10。所以个位为10的0次方(1),十位为十的1次方(10),百位为十的2次方(100)……
    二进制数的权值基数是2,所以……
  3. 十进制数用到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转换为二进制)

(作业:请大家立即动手,找纸找笔,用上图的方式,将十进制数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进制整数与二进制之间的互相换算。并验算前面的作业。

版权所有 谢绝复制。作者:南郁(nanyu) www.d2school.com