计算机中二进制、八进制、十进制、十六进制之间如何转换以及如何正确理解进制。

一. 进制的含义

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。

对于任何一种进制---X进制,就表示每一位上的数运算时都是逢X进一位

十进制逢十进一十六进制逢十六进一二进制就是逢二进一,以此类推,x进制就是逢x进位。

二. 进制的种类

1. 十进制

为了便于理解,我们先从我们最熟悉的十进制开始了解。在学习数学中,我们基本都是使用十进,所以十进制就是我们所熟悉的那样:

十进制的原理:逢十进一

十进制的权重是10,每个位取0~9

2. 二进制

因为十进制我们很是熟悉,在此不做过多概述,我们接着来看二进制。二进制是比较重要的。电子计算机出现以后,使用电子管来表示十种状态过于复杂,所以所有的电子计算机中只有两种基本的状态,开和关。 也就是说,电子管的两种状态决定了以电子管为基础的电子计算机采用二进制来表示数字和数据。

二进制的原理逢二进一

二进制的权重2,每个位取0~1

那么我们先举一个例子,十进制的1234是如何来的呢?在十进制中:

1234 = 1000 + 200 + 30 + 4

         = 1*(10^3)+2*(10^2)+3*(10^1)+4*(10^0)

同理那么在二进制中的100是如何来的呢?二进制的100在十进制中时表示多少数呢?根据上面的例子,同理可得:

100 = 1*(2^2)+0*(2^1)+0*(2^0) = 4

 看到这里肯定会出错的,为了方便区分,官方的我们通常情况是将每个进制用规定的特殊符号作为前缀后缀来加以表示。

二进制规定:前缀:0B

例如:二进制的100是十进制的4。下面程序运行结果就是4。

#include <stdio.h>
int main()
{
	int val = 0B100;
	printf("%d\n", val);
                       //注意:&d输出的是十进制的数
	return 0;
}

3. 八进制

经过了前面二进制与十进制的学习,其实八进制与十六进制都是大同小异。

八进制的原理逢八进一

八进制权重8,每个位取0~7

那么在八进制中的123是如何来的呢?八进制的123在十进制中时表示多少数呢?我们再举个例子:

123 = 1*(8^2)+2*(8^1)+3*(8^0) = 83

八进制规定:前缀:0

例如:八进制的123是十进制的83。下面程序运行结果就是83。

#include <stdio.h>
int main()
{
	int val = 0123;
	printf("%d\n", val);

	return 0;
}

4. 十六进制

十六进制的原理逢十六进一

十六进制权重16,每个位取0~15

当然了,每个位肯定只能有一个数,那么十六进制中10/11/12/13/14/15要如何表示呢?其实就是利用英文字母所来代替。其实这里很好理解,就是用字母来表示。

二进制中的数十六进制
10a/A
11

b/B

12c/C
13d/D
14e/E
15f/F

那么在十六进制中的1a2b3c是如何来的呢?十六进制的1a2b3c在十进制中时表示多少数呢?我们再举个例子:

1a2b3c = 1*(16^5)+a*(16^4)+2*(16^3)+b*(16^2)+3*(16^1)+c*(16^0)

             = 1*(16^5)+10*(16^4)+2*(16^3)+11*(16^2)+3*(16^1)+12*(16^0)

             = 1715004

十六进制规定:前缀:0X

 例如:十六进制的1a2b3c是十进制的1715004。下面程序运行结果就是1715004。

#include <stdio.h>
int main()
{
	int val = 0x1a2b3c;
	printf("%d\n", val);

	return 0;
}

三. 进制之间转换

1. 二进制、八进制、十六进制转十进制

其实通过了上面的几个例子,我们已经引出了其中简单的进制转化:

OB100 = 1*(2^2)+0*(2^1)+0*(2^0) = 4

0123 = 1*(8^2)+2*(8^1)+3*(8^0) = 83

0X1a2b3c = 1*(16^5)+a*(16^4)+2*(16^3)+b*(16^2)+3*(16^1)+c*(16^0)= 1715004

所以由上述中的例子,可易得一下方法。

(1). 二进制转十进制

OBxyzw...N   =     x*( 2 的(x之后的位数)的次方)

                           +y*( 2 的(y之后的位数)的次方)

                           +z*( 2 的(z之后的位数)的次方)

                           +w*( 2 的(w之后的位数)的次方)

                           +......+

                           +N*( 2 的(N之后的位数)的次方)

(2). 八进制转十进制

0xyzw...N   =     x*( 8 的(x之后的位数)的次方)

                           +y*( 8 的(y之后的位数)的次方)

                           +z*( 8 的(z之后的位数)的次方)

                           +w*( 8 的(w之后的位数)的次方)

                           +......+

                           +N*( 8 的(N之后的位数)的次方)

(3). 十六进制转十进制

0Xxyzw...N   =     x*( 16 的(x之后的位数)的次方)

                           +y*( 16 的(y之后的位数)的次方)

                           +z*( 16 的(z之后的位数)的次方)

                           +w*( 16 的(w之后的位数)的次方)

                           +......+

                           +N*( 16 的(N之后的位数)的次方)

 其实上面的转化成十进制都很好理解,但是就是下面的十进制转化成二进制、八进制、十六进制是有些难度的,但是不要担心,也并不是很难掌握,耐心即可。

2. 十进制转二进制、八进制、十六进制

a. 十进制转二进制

正数

方法一:辗转相除法,从下往上读

其实这个方法就是简单的数学方法:

例如:十进制123如何转化成二进制?

 未满8个位,用0补齐。所以十进制123转化成二进制的最终结果是0B01111011

方法二:分解法

分解法其实也很简单,就只要找到与它本身最相近的2的次方数。

123=64+59

      =64+32+27

      =64+32+16+11

      =64+32+16+8+3

      =2^6+2^5+2^4+2^3+2^1+2^0


所以在位数分别是7/6/5/4/2/1上的数字是1。

未满8个位,用0补齐。所以十进制123转化成二进制的最终结果是0B01111011

负数

为何正数与负数的进制转化不同呢?这是因为:

正数:原码等于补码。

负数:原码与补码不同。负数的补码是其反码加一。

所以这里注意负数的进制转化与正数是有区别的。那么如何求负数的补码呢?

其实简单来说就是按位取反+1、还原符号位

例如:-100的二进制如何表示?

-100:

注意:在最高位为 1 表示负号。

第一步求原码:100 = 64+32+4 = 2^6+2^5+2^2

       原码:1110 0100

第二步求反码:按位取反,符号位不变

       反码:1001 1011

第三部求补码:反码加1,1001 1011+1=1001 1100

所以-100转化成二进制的最终结果是0B1001 1100

例如:0B1111 1100的十进制?

原码:1111 1100

反码:1000 0011

补码:1000 0100


所以,-(1*2^2+0*2^1+0*2^0)=  -4

所以0B1111 1100转化成十进制的最终结果是-4

b. 十进制转八进制

例如100的八进制如何表示?

 所以100转化成八进制的最终结果是0144

c. 十进制转十六进制

例如123的十六进制如何表示?

 所以100转化成八进制的最终结果是7b

3. 二进制转八进制、十六进制

其实,二进制转八进制、十六进制与二进制转十进制思路是相似的。我们再来回顾一下,二进制如何转十进制:

二进制转十进制:

OBxyzw...N   =     x*( 2 的(x之后的位数)的次方)

                           +y*( 2 的(y之后的位数)的次方)

                           +z*( 2 的(z之后的位数)的次方)

                           +w*( 2 的(w之后的位数)的次方)

                           +......+

                           +N*( 2 的(N之后的位数)的次方)

a. 二进制转八进制

由于2的3次方等于8,八进制和二进制之间的转化是三次方的关系,可以把二进制数分段转化,也就是从后向前开始,三位三位的转化。

例如:0B10 1001 0101 1111 0011的八进制

101001010111110011
1*2^2+1*2^01*2^01*2^11*2^2+1*2^1+1*2^01*2^2+1*2^11*2^1+1*2^0
512763

 所以0B10 1001 0101 1111 0011转化成八进制的最终结果是0512763

二进制转八进制:

①. OBxyzw...N   先将其每三个一划分:

OBx(1)y(1)z(1)  OBx(2)y(2)z(2)  OBx(3)y(3)z(3)   .....OBx(N)y(N)z(N)  

②.  OBx(1)y(1)z(1) =            x(1)*( 2 的(x(1)之后的位数==2)的次方)

+y(1)*( 2 的(y(1)之后的位数==1)的次方)

+z(1)*( 2 的(z(1)之后的位数==0)的次方)

OBx(2)y(2)z(2) =            x(2)*( 2 的(x(2)之后的位数==2)的次方)

+y(2)*( 2 的(y(2)之后的位数==1)的次方)

+z(2)*( 2 的(z(2)之后的位数==0)的次方)

OBx(3)y(3)z(3) =            x(3)*( 2 的(x(3)之后的位数==2)的次方)

+y(3)*( 2 的(y(3)之后的位数==1)的次方)

+z(3)*( 2 的(z(3)之后的位数==0)的次方)


③. 从前向后依次写出最终结果。 

b. 二进制转十六进制

由于2的4次方等于16,十六进制和二进制之间的转化是四次方的关系,可以把二进制数分段转化,也就是从后向前开始,四位四位的转化。

例如:0B0001 0101 0010 1010 1010

00010101001010101010
11*2^2+1*2^01*2^11*2^3+1*2^11*2^3+1*2^1
152aa

所以0B0001 0101 0010 1010 1010转化成八进制的最终结果是0X152aa


好啦,今天进制转化的学习就到这里啦~

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安心学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值