问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

二进制:计算机编程的基础

创作时间:
作者:
@小白创作中心

二进制:计算机编程的基础

引用
CSDN
1.
https://blog.csdn.net/qq_37756660/article/details/137517145

二进制是计算机科学的基础,理解二进制对于学习编程至关重要。本文将从人类计数的发展史出发,深入浅出地介绍二进制的概念、原理及其在计算机编程中的应用。

什么是二进制计数法?

为了更好地理解二进制计数法,我们先来简单回顾一下人类计数的发展史。

  • 原始时代,人类用路边的小石子来统计放牧归来的羊只数量,这表明我们很早就产生了计数的意识。
  • 后来,罗马人用手指作为计数的工具,并在羊皮上画出Ⅰ、Ⅱ、Ⅲ来代替手指的数量。表示一只手时,就写成“Ⅴ”形,表示两只手时,就画成“ⅤⅤ”形等等。
  • 公元3世纪左右,印度数学家(也有说法是阿拉伯人)发明了阿拉伯数字。阿拉伯数字由从0到9这10个计数符号组成,并采取进位制法,高位在左,低位在右,从左往右书写。由于阿拉伯数字本身笔画简单,演算便利,因此它们逐渐在各国流行起来,成为世界通用的数字。

日常生活中,我们广泛使用的十进制计数法,也是基于阿拉伯数字的。这也是十进制计数法的基础。因此,相对其他计数方法,十进制最容易被我们所理解。

让我们来观察一个数字:2871。

其中^表示幂或次方运算。十进制的数位(千位、百位、十位等)全部都是10^n的形式。需要特别注意的是,任何非0数字的0次方均为1。在这个新的表示式里,10被称为十进制计数法的基数,也是十进制中“十”的由来。这个我想你应该好理解,因为这和我们日常生活的习惯是统一的。

明白了十进制,我们再试着用类似的思路来理解二进制的定义。我以二进制数字110101为例,解释给你听。我们先来看,这里110101究竟代表了十进制中的数字几呢?

刚才我们说了,十进制计数是使用10作为基数,那么二进制就是使用2作为基数,类比过来,二进制的数位就是2^n的形式。如果需要将这个数字转化为人们易于理解的十进制,我们就可以这样来计算:

按照这个思路,我们还可以推导出八进制(以8为基数)、十六进制(以16为基数)等等计数法,很简单,在这里就不赘述了。

至此,你应该已经理解了什么是二进制。但是仅有数学的理论知识是不够的,结合相关的代码实践,相信你会有更深刻的印象。

计算机为什么使用二进制?

我觉得,计算机使用二进制和现代计算机系统的硬件实现有关。组成计算机系统的逻辑电路通常只有两个状态,即开关的接通与断开。

断开的状态我们用“0”来表示,接通的状态用“1”来表示。由于每位数据只有断开与接通两种状态,所以即便系统受到一定程度的干扰时,它仍然能够可靠地分辨出数字是“0”还是“1”。因此,在具体的系统实现中,二进制的数据表达具有抗干扰能力强、可靠性高的优点。

相比之下,如果用十进制设计具有10种状态的电路,情况就会非常复杂,判断状态的时候出错的几率就会大大提高。

另外,二进制也非常适合逻辑运算。逻辑运算中的“真”和“假”,正好与二进制的“0”和“1”两个数字相对应。逻辑运算中的加法(“或”运算)、乘法(“与”运算)以及否定(“非”运算)都可以通过“0”和“1”的加法、乘法和减法来实现。

二进制的位操作

了解了现代计算机是基于二进制的,我们就来看看,计算机语言中针对二进制的位操作。这里的位操作,也叫作位运算,就是直接对内存中的二进制位进行操作。常见的二进制位操作包括向左移位和向右移位的移位操作,以及“或”“与”“异或”的逻辑操作。下面我们一一来看。

向左移位

我们先来看向左移位。

二进制110101向左移一位,就是在末尾添加一位0,因此110101就变成了1101010。请注意,这里讨论的是数字没有溢出的情况。

所谓数字溢出,就是二进制数的位数超过了系统所指定的位数。目前主流的系统都支持至少32位的整型数字,而1101010远未超过32位,所以不会溢出。如果进行左移操作的二进制已经超出了32位,左移后数字就会溢出,需要将溢出的位数去除。

在这个例子中,如果将1101010换算为十进制,就是106,你有没有发现,106正好是53的2倍。所以,我们可以得出一个结论:二进制左移一位,其实就是将数字翻倍

向右移位

接下来我们来看向右移位。

二进制110101向右移一位,就是去除末尾的那一位,因此110101就变成了11010(最前面的0可以省略)。我们将11010换算为十进制,就是26,正好是53除以2的整数商。所以二进制右移一位,就是将数字除以2并求整数商的操作

位的“或”

我们刚才说了,二进制的“1”和“0”分别对应逻辑中的“真”和“假”,因此可以针对位进行逻辑操作。

逻辑“或”的意思是,参与操作的位中只要有一个位是1,那么最终结果就是1,也就是“真”。如果我们将二进制110101和100011的每一位对齐,进行按位的“或”操作,就会得到110111。

位的“与”

同理,我们也可以针对位进行逻辑“与”的操作。“与”的意思是,参与操作的位中必须全都是1,那么最终结果才是1(真),否则就为0(假)。如果我们将二进制110101和100011的每一位对齐,进行按位的“与”操作,就会得到100001。

位的“异或”

逻辑“异或”和“或”有所不同,它具有排异性,也就是说如果参与操作的位相同,那么最终结果就为0(假),否则为1(真)。所以,如果要得到1,参与操作的两个位必须不同,这就是此处“异”的含义。我们将二进制110101和100011的每一位对齐,进行按位的“异或”操作,可以得到结果是10110。

总结一下,“异或”操作的本质其实就是,所有数值和自身进行按位的“异或”操作之后都为0。而且要通过“异或”操作得到0,也必须通过两个相同的数值进行按位“异或”。这表明了两个数值按位“异或”结果为0,是这两个数值相等的必要充分条件,可以作为判断两个变量是否相等的条件。

小结

今天我们聊了二进制,你可能会问:学习二进制究竟有什么用呢?平时的编程中,我们好像并没有使用相关的知识啊?确实,目前的高级语言可以帮助我们将人类的思维逻辑转换为使用0和1的机器语言,我们不用再为此操心了。但是,二进制作为现代计算机体系的基石,这些基础的概念和操作,你一定要非常了解。

二进制贯穿在很多常用的概念和思想中,例如逻辑判断、二分法、二叉树等等。逻辑判断中的真假值就是用二进制的1和0来表示的;二分法和二叉树都是把要处理的问题一分为二,正好也可以通过二进制的1和0来表示。因此,理解了二进制,你就能更加容易地理解很多计算机的数据结构和算法,也为我们后面的学习打下基础。

思考题

如果不使用Java语言自带的BigInteger类,我们还有什么方法来实现十进制到二进制的转换呢?(提示:可以使用二进制的移位和按位逻辑操作来实现。)

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号