世界上有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

一枚数据分析的爱好者~

<think>嗯,用户问的是二进制1111乘以1111等于多少,结果用二进制表示。首先,我得确认自己是不是正确理解了这个问题。二进制乘法啊,十进制的乘法类似,但进位的时候是逢二进一。不过,用户可能不太清楚具体步骤,所以需要详细分解一下。 首先,我应该回忆一下二进制乘法的基本规则。每一位相乘,然后加上进位,对吧?可能需要先写出每个步骤,确保用户能看。不过,可能还有其他方法,比如转换成十进制计算后再转回二进制,这样会不会更简单呢?不过用户可能希望看到二进制直接相乘的过程,所以两种方法都介绍一下可能更好。 先考虑直接二进制乘法。二进制1111转换成十进制是15,对吧?15乘15等于225,然后225转换成二进制是多少呢?这可以作为验证结果是否正确的方法。不过用户可能更想看二进制竖式乘法的过程,所以这一步不能省。 好,开始分解二进制1111×1111。首先,每个位相乘,然后移位相加。二进制只有01,所以每一位相乘的结果要么是0,要么是1,不过要考虑进位。比如,从最低位开始,最右边的1分别乘以一个数的每一位,然后左移一位,接着处理次低位,依此类推。 具体步骤可能是这样的: 1111 × 1111 ---------- 首先,乘数的最低位(右边第一个1)乘以被乘数每一位,得到1111,然后左移0位,结果还是1111。 然后,乘数的第二个1(从右数第二位)乘以被乘数,得到1111,左移一位变成11110。 第三个1乘以被乘数,得到1111,左移两位变成111100。 第四个1乘以被乘数,得到1111,左移三位变成1111000。 现在把这四个部分加起来: 1111 11110 111100 +1111000 ---------- 然后进行二进制加法。这里可能需要分步加,比如先加前两个,再逐步加上后面的。例如: 1111 + 11110: 先对齐: 01111 +11110 = 101101(因为从右开始加,每一位相加,注意进位) 然后加上第三个部分111100: 101101 +111100 = 1101001(可能需要逐位相加,注意进位) 接着加上最后一个部分1111000: 1101001 +1111000 = 11100001(这里可能需要再次检查进位是否正确) 不过这样算下来,结果应该是11100001,对应的十进制是225,对吗?因为128+64+32+1=225。或者是不是哪里出错了?可能需要再仔细核对每一步的加法是否正确。 或者,可能更简单的方法是先转换成十进制计算。二进制1111是1×2³ +1×2² +1×2¹ +1×2⁰=8+4+2+1=15。所以15×15=225,转换成二进制的话,225除以2,余数依次是1、0、0、0、0、1、1、1,所以二进制是11100001。这样结果应该是正确的。 不过用户可能希望看到二进制乘法的详细过程,所以需要把每一步的相乘加法过程写清楚。比如,每一位相乘,然后移位,再相加。这样用户能理解二进制乘法的机制。 外,可能需要提醒用户,二进制乘法虽然步骤十进制类似,但进位是二进制的,所以每一步相加的时候要注意进位处理。比如,1+1=0进1,以此类推。 总结一下,先进行二进制竖式乘法,得到各个部分积,再相加,或者转换十进制计算后转回二进制。两种方法都得到11100001,所以答案应该是这个。不过为了确保正确,再检查一次加法步骤是否正确。</think>二进制乘法可以通过分步计算完成,以下是详细过程: **步骤1:写出乘数被乘数** ``` 1111 × 1111 ``` **步骤2:逐位相乘并移位相加** 1. **最低位(第1位)相乘** `1111 × 1 = 1111`(不位移) 2. **次低位(第2位)相乘** `1111 × 1 = 1111`,左移1位 → `11110` 3. **次高位(第3位)相乘** `1111 × 1 = 1111`,左移2位 → `111100` 4. **最高位(第4位)相乘** `1111 × 1 = 1111`,左移3位 → `1111000` **步骤3:将所有部分积相加** ``` 1111 + 11110 +111100 +1111000 ---------- 11100001 ``` **步骤4:验证结果(十进制转换法)** - 二进制 `1111` = 十进制 $15$ - $15 \times 15 = 225$ - 十进制 $225$ 转二进制: $225 = 128 + 64 + 32 + 1 = 11100001_2$ **最终答案** 二进制 `1111 × 1111 = 11100001`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值