`
xuleizhong
  • 浏览: 4280 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

进制转换详解

阅读更多
进制转换详解

6.1 为什么需要八进制和十六进制?

 

编程中,我们常用的还是10进制……必竟C/C++是高级语言。

比如:

int a = 100,b = 99;

不过,由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。

但,二进制数太长了。比如int 类型占用4个字节,32位。比如100,用int类型的二进制数表达将是:

0000 0000 0000 0000 0110 0100

面对这么长的数进行思考或操作,没有人会喜欢。因此,C,C++ 没有提供在代码直接写二进制数的方法。

 

用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢?

2、8、16,分别是2的1次方,3次方,4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。在下面的关于进制转换的课程中,你可以发现这一点。

 

6.2 二、八、十六进制数转换到十进制数

6.2.1 二进制数转换为十进制数

二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……

所以,设有一个二进制数:0110 0100,转换为10进制为:

下面是竖式:

 

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 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100

 

0乘以多少都是0,所以我们也可以直接跳过值为0的位:

1 * 22 + 1 * 23 +   1 * 25 + 1 * 26 = 100

 

6.2.2 八进制数转换为十进制数

八进制就是逢8进1。

八进制数采用 0~7这八数来表达一个数。

八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……

所以,设有一个八进制数:1507,转换为十进制为:

用竖式表示:

 

1507换算成十进制。

 

第0位 7 * 80 = 7

第1位 0 * 81 = 0

第2位 5 * 82 = 320

第3位 1 * 83 = 512    +

--------------------------

               839

同样,我们也可以用横式直接计算:

7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839

 

结果是,八进制数 1507 转换成十进制数为 839

 

6.2.3 八进制数的表达方法

C,C++语言中,如何表达一个八进制数呢?如果这个数是 876,我们可以断定它不是八进制数,因为八进制数中不可能出7以上的阿拉伯数字。但如果这个数是123、是567,或12345670,那么它是八进制数还是10进制数,都有可能。

所以,C,C++规定,一个数如果要指明它采用八进制,必须在它前面加上一个0,如:123是十进制,但0123则表示采用八进制。这就是八进制数在C、C++中的表达方法。

由于C和C++都没有提供二进制数的表达方法,所以,这里所学的八进制是我们学习的,CtC++语言的数值表达的第二种进制法。

现在,对于同样一个数,比如是100,我们在代码中可以用平常的10进制表达,例如在变量初始化时:

 

int a = 100;

我们也可以这样写:

int a = 0144; //0144是八进制的100;一个10进制数如何转成8进制,我们后面会学到。

 

千万记住,用八进制表达时,你不能少了最前的那个0。否则计算机会通通当成10进制。不过,有一个地方使用八进制数时,却不能使用加0,那就是我们前面学的用于表达字符的“转义符”表达法。

 

6.2.4 八进制数在转义符中的使用

我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示Tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ASCII码等于该值的字符。

比如,查一下第5章中的ASCII码表,我们找到问号字符(?)的ASCII值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为C,C++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

事实上我们很少在实际编程中非要用转义符加八进制数来表示一个字符,所以,6.2.4小节的内容,大家仅仅了解就行。

 

6.2.5 十六进制数转换成十进制数

2进制,用两个阿拉伯数字:0、1;

8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;

10进制,用十个阿拉伯数字:0到9;

16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?

 

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。

十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……

所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

假设有一个十六进数 2AF5, 那么如何换算成10进制呢?

 

用竖式计算:

 

2AF5换算成10进制:

 

第0位:   5 * 160 = 5

第1位:   F * 161 = 240

第2位:   A * 162 = 2560

第3位:   2 * 163 = 8192   +

-------------------------------------

                  10997  

直接计算就是:

5 * 160   + F * 161 + A * 162 +2 * 163 = 10997

(别忘了,在上面的计算中,A表示10,而F表示15)

 

现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。

假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:

1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

 

6.2.6   十六进制数的表达方法

如果不使用特殊的书写形式,16进制数也会和10进制相混。随便一个数:9876,就看不出它是16进制或10进制。

C,C++规定,16进制数必须以 0x开头。比如 0x1表示一个16进制数。而1则表示一个十进制。另外如:0xff,0xFF,0X102A,等等。其中的x也也不区分大小写。(注意:0x中的0是数字0,而不是字母O)

以下是一些用法示例:

 

int a = 0x100F;

int b = 0x70 + a;

 

至此,我们学完了所有进制:10进制,8进制,16进制数的表达方式。最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

 

6.2.7 十六进制数在转义符中的使用

 

转义符也可以接一个16进制数来表示一个字符。如在6.2.4小节中说的 '?' 字符,可以有以下表达方式:

 

'?'      //直接输入字符

'\77'    //用八进制,此时可以省略开头的0

'\0x3F' //用十六进制

 

同样,这一小节只用于了解。除了空字符用八进制数 '\0' 表示以外,我们很少用后两种方法表示一个字符。

 

6.3 十进制数转换到二、八、十六进制数

6.3.1 10进制数转换为2进制数

 

给你一个十进制,比如: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

(在计算机中,÷用 / 来表示)

 

如果是在考试时,我们要画这样表还是有点费时间,所更常见的换算过程是使用下图的连除:

(图:1)

请大家对照图,表,及文字说明,并且自已拿笔计算一遍如何将6转换为二进制数。

说了半天,我们的转换结果对吗?二进制数110是6吗?你已经学会如何将二进制数转换成10进制数了,所以请现在就计算一下110换成10进制是否就是6。

 

6.3.2 10进制数转换为8、16进制数

 

非常开心,10进制数转换成8进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成8。

 

来看一个例子,如何将十进制数120转换成八进制数。

 

用表格表示:

被除数 计算过程 余数
120 120/8 15 0
15 15/8 1 7
1 1/8 0 1

 

120转换为8进制,结果为:170。

 

非常非常开心,10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。

 

同样是120,转换成16进制则为:

被除数 计算过程 余数
120 120/16 7 8
7 7/16 0 7

 

120转换为16进制,结果为:78。

 

请拿笔纸,采用(图:1)的形式,演算上面两个表的过程。

 

6.4 二、十六进制数互相转换

 

二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。

我们也一样,只要学完这一小节,就能做到。

首先我们来看一个二进制数:1111,它是多少呢?

你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23 = 8,然后依次是 22 = 4,21=2, 20 = 1。

 

记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

 

下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

 

仅4位的2进制数   快速计算方法    十进制值      十六进值

1111         = 8 + 4 + 2 + 1   = 15           F

1110         = 8 + 4 + 2 + 0   = 14           E

1101         = 8 + 4 + 0 + 1   = 13           D          

1100         = 8 + 4 + 0 + 0   = 12           C          

1011         = 8 + 4 + 0 + 1   = 11           B          

1010         = 8 + 0 + 2 + 0   = 10           A

1001         = 8 + 0 + 0 + 1   = 10           9

....

0001         = 0 + 0 + 0 + 1   = 1            1

0000         = 0 + 0 + 0 + 0   = 0            0

 

二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

如(上行为二制数,下面为对应的十六进制):

 

1111 1101 , 1010 0101 , 1001 1011

F     D    ,   A     5    ,   9     B  

 

反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

先转换F:

看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。

接着转换 D:

看到D,知道它是13,13如何用8421凑呢?应该是:8 + 2 + 1,即:1011。

所以,FD转换为二进制数,为: 1111 1011

 

由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。

比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:

被除数 计算过程 余数
1234 1234/16 77 2
77 77/16 4 13 (D)
4 4/16 0 4

 

结果16进制为: 0x4D2

 

然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。

其中对映关系为:

0100 -- 4

1011 -- D

0010 -- 2

 

同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。

下面举例一个int类型的二进制数:

01101101 11100101 10101111 00011011

我们按四位一组转换为16进制: 6D E5 AF 1B

分享到:
评论
1 楼 aokunsang 2010-03-23  
1011 -- D   这个应该是1101,
然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。 也是错误的哦、

相关推荐

    进制转换详解(附练习题)

    进制转换是计算机科学中的基础概念,理解和掌握各种进制之间的转换对于理解计算机的工作原理至关重要。本文将深入探讨进制转换的基本原理,并提供相关的练习题以帮助学习者巩固理解。 一、进制系统概述 进制,也...

    进制以及进制转换详解.ppt

    进制和进制转换是计算机科学中的基础知识,对于理解计算机如何存储和处理数据至关重要。本文主要探讨了进位计数的思想,重点介绍了二进制、八进制和十六进制,以及它们与十进制之间的转换。 首先,进位记数制是一种...

    进制以及进制转换详解PPT学习教案.pptx

    将二进制转换为十进制,可以使用按位展开和按权相加的方法,即将二进制数的每一位乘以2的相应幂,然后将结果求和。例如,(1101.01)2转换为十进制是(1×2^3 + 1×2^2 + 0×2^1 + 1×2^0 + 0×2^(-1) + 1×2^(-2)) = ...

    各进制转换

    进制转换详解 进制转换是计算机科学中一种基本的数据表示形式转换,它包括八进制、十进制、十六进制等多种进制之间的转换。下面我们将详细解释进制转换的原理和实现方法。 一、为什么需要进制转换? 在计算机科学...

    C语言实现进制转换函数的实例详解

    C语言实现进制转换函数的实例详解 C语言是一种广泛使用的编程语言,它提供了强大的编程能力,包括实现进制转换函数。在本文中,我们将详细介绍C语言实现进制转换函数的实例详解,包括二进制、八进制、十六进制转换...

    vb 小型计算器与进制转换

    【VB.NET小型计算器与进制转换详解】 VB.NET(Visual Basic .NET)是Microsoft开发的一种面向对象的编程语言,它是Visual Basic的升级版本,支持.NET Framework。在这个“VB小型计算器与进制转换”项目中,开发者...

    魔兽争霸 WAR3 JASS技能ID进制转换器

    《魔兽争霸WAR3 JASS技能ID进制转换器详解及应用》 在魔兽争霸III(WAR3)的游戏世界中,地图编辑器与JASS(Just Another Scripting System)语言为玩家提供了无限的创意空间,让游戏爱好者能够自定义游戏规则、...

    C#进制转换

    ### C# 进制转换详解 在计算机科学与编程领域,数据表示的不同进制转换是一项基本而重要的技能。本文将详细介绍如何在C#语言中实现二进制(2进制)、八进制(8进制)、十进制(10进制)与十六进制(16进制)之间的...

    基于mfc的进制转换

    **基于MFC的进制转换详解** MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于简化Windows应用程序的开发。它基于面向对象的设计,使得开发者可以更高效地利用Windows API。在这个主题中,我们将...

    VB写的进制转换(含源码)

    **VB进制转换详解** 在计算机科学中,进制转换是一项基本操作,常见的有二进制、八进制、十进制和十六进制之间的转换。Visual Basic(VB)作为一款面向对象的编程语言,提供了丰富的功能来实现这些转换。本篇文章将...

    进制转换.pdf

    ### 进制转换详解 #### 一、进制的基本概念 在数字系统中,不同的进制代表了不同的计数方式。我们通常所接触到的主要有四种进制:二进制、八进制、十进制以及十六进制。下面将详细介绍这几种进制的基本构成以及...

    C#开发的进制转换器

    《C#实现的多进制转换器详解》 在编程领域,进制转换是一项基础但重要的技能,尤其在处理二进制、八进制、十进制和十六进制数据时。C#作为.NET框架的主要编程语言,提供了丰富的库和功能来支持这类操作。本文将深入...

    72进制转换

    ### 72进制转换详解 #### 一、概述 在计算机科学与数学领域中,进制转换是一项基本且重要的技能。通常我们处理的是十进制(如日常计数)、二进制(如计算机内部数据表示)等常见进制。然而,本篇文章将探讨一种...

    c_c++进制转换源代码

    "C++进制转换源代码详解" 本文将详细介绍 C++ 进制转换源代码的实现原理、代码结构和关键技术要点。 进制转换的原理 在计算机科学中,进制转换是指将数字从一种进制转换为另一种进制的过程。常见的进制有二进制、...

    jisuanqi-.rar_数码管计算器_进制转换

    《51单片机数码管计算器与进制转换详解》 在电子工程和嵌入式系统设计中,51单片机因其结构简单、性价比高而广泛应用。本项目中的“jisuanqi-.rar”文件是一个基于51单片机的数码管计算器程序,实现了丰富的功能,...

    ASCii转换 进制转换工具exe文件

    2. **进制转换原理**:进制转换是将一个数从一种进制转换为另一种进制的过程。例如,从十进制转二进制,可以使用“除基取余”法;从二进制转十进制,可以按权展开求和。对于其他进制,原理类似,只是基数不同。 3. ...

    信息学奥赛基础(CSP第一轮):进制转换模拟题附答案

    ### 信息学奥赛基础(CSP第一轮):进制转换知识点详解 #### 进制转换概述 在计算机科学领域,尤其是对于参加信息学奥林匹克竞赛(如NOIP)的学生而言,掌握不同进制之间的转换是非常重要的基础技能之一。本文将...

Global site tag (gtag.js) - Google Analytics