前一段时间看到网上有个笑话——世界上有10种人,一种懂二进制的,另一种不懂,这时有人问这不是才2种人吗? 哈哈哈不知你反应过来了吗?这个笑话也侧面反映了理解二进制系统的重要性,请细读下文,待我一步步揭开二进制的面纱。
编程新手在进行文件交互时常会遇到如下问题 什么是解码与编码,它们的本质是什么?在用编程语言进行读入、读出文件时会出现乱码的原因是什么?以及Unicode,UTF-8,GBK编码方式的区别在哪?想要真正的理解透这些问题,那么必须先深入性的了解二进制系统的一些知识。
本文我将从介绍二进制是什么以及与各进制之间转换方式逐步入手。
1、二进制介绍
大家在网上肯定看到过上图这种庞大的数字照片,总给人一种黑客的神秘感,仔细一看,这类照片里的数字都是由0和1构成。在计算机内部里有电路和电线,由它们负责传送所有的信息,那么如何用电来储存或传递信息呢?
我们假设有一条有电流通过的电线,信号只有两种表达方式即打开(ON)和关闭(NO)或者在计算机网络里是高平和低平或对与错,1或0。或者其他只有两个选项的事物。单条线路上的开/关状态被称为一个比特(bit),这就是我们常听到的计算机信息储存中最小量的由来。
我们常用的进制有十进制、二进制和十六进制,我们先来看十进制,例如:7896这个数。这是一位四位数,每一位的数字都是由0~9构成,也就是说十进制的每一位都是小于十的自然数。
那么由这个规则我们可以推广到其他进制的数,例如二进制的数每一位都是小于2,即0和1构成,其他进制也同理。
2、各进制之间的转换
同一个数可以用不同进制数来进行表示,它们的意义是一样的,只是看起来不同而已。那么不同进制的数又该如何转换呢? 例如:
如下,我们也可以推广成二进制转十进制,同理其他进制转十进制也可以这么展开。
那么怎么将十进制转为二进制呢?其实这与上就是上面的逆过程,但是太麻烦,有个大家都听过的短除法。例如我们将十进制的18转为二进制数。
小结上面的两个例子就是各进制转十进制、十进制转各进制的过程,那么如果N进制转M进制呢?我的建议是先将N进制转成十进制再转成M进制。
3、十六进制
我们再来谈谈十六进制,前面提过计算机是采用二进制进行计算的,但是二进制有个问题就是信息密度低,要用很多位才能表示一个数,不利于人阅读,所以在电脑显示时人们通常让它转为十六进制。
十六进制由0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F这十六个字符组成。
二进制数转十六进制数也十分方便,这里有两个方法,一是上边提到的二进制先转成十进制,再转成十六进制;二是从数字的后面即右边开始每四位转一个十六进制数,当到开头是不满四位以零填补就可以了又称8421法。
我们使用第二个方法将二进制的 101101101011011100 转换为十六进制,如图从尾开始,四个为一组,我们得到五组四位二进制数。
我们将该五组的四位二进制分别转换为十进制,再将十进制相组合的结果就是最终十六进制啦。其十六进制结果为 2DADC ,如下图。
那么此时我们再考虑一下由十六进制转为二进制,此时使用权重法太过于麻烦,我们刚好可以利用上面第二个方法的逆过程,如下图。
下面贴出二进制转换十进制的C语言代码:
#include <stdio.h>
#include <stdlib.h>
// 二进制转十进制
int main(){
char a[17];
gets(a);
int len,i,sum=0,m,j;
len=strlen(a);
if(len<=16){
for(i=0;i<len;i++){
m=1;
if(a[i]=='1'){
for(j=1;j<=len-i-1;j++)
m*=2;
sum+=m;
}
}
printf("你输入的二进制数为:%s\n",a);
printf("转换为十进制数为:%d\n",sum);
}
return 0;
}
更多原创文章请关注我的公众号:DataUser
一枚数据分析的爱好者~