世界上有10种人,一种懂二进制的,另一种不懂

前一段时间看到网上有个笑话——世界上有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

一枚数据分析的爱好者~

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值