【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

逻辑运算系列(一):入门篇

  • 2019-09-03
  • 本文字数:3334 字

    阅读完需:约 11 分钟

逻辑运算系列(一):入门篇

本系列的重点内容是分享微电原理与电子信息,考虑到是系列文章的第一篇,本文决定从简单的逻辑运算入手,由浅入深开展整个系列。


对于有编程基础的开发者而言,二进制和逻辑运算中的“与、或、非”是非常熟悉的基础知识。在开始整个话题之前,先看下面几行代码(本文以 C 语言为例):



如上是一个典型的逻辑与应用:定义了四个 char 类型数组,分别命名为账号,密码,输入账号,输入密码,scanf_s 获取用户输入的数据,然后保存到对应的变量中,strcmp 函数是比较两个传入的字符串,如果两个字符串相同,则返回 0。然后通过 &&(逻辑与)比较输入的账号和密码与默认设置的账号和密码,如果都相同,则打印 “Yes”,如果有其中一个不正确,则打印 “No”。


这是 C 语言中的“与”逻辑运算,还有“或”逻辑和“非”逻辑,此处不一一举例了,接下来将分享逻辑运算的诞生和原理。


这里需要介绍两位重要人物,一位是冯·诺依曼(关于他的成就以及生平简介,感兴趣的可以自行搜索,此处不赘述),他对计算机发展史最重要的贡献之一就是首次提出二进制控制程序概念,而二进制就是计算机的基础也是逻辑运算“与、或、非”的基础。


另一位重要人物是数学家布尔,他首次采用数学方法研究逻辑问题,成功地建立了逻辑运算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律。某些编程语言里面有布尔类型这个说法,也是依据于此。


区别于其他进制,二进制最明显的特点就是极强的操控性和稳定性,举个最简单的例子,家里的电灯,可以控制它打开或者关闭,但是没办法控制它半开半闭,二进制就是相同的道理,所以二进制广泛存在于各行各业。


那么,二进制具体来说怎么理解呢?这就与中央处理器(CPU,Central Processing Unit)有关了,CPU 是一块超大规模的集成电路,主要由控制单元、运算单元、存储单元构成,是一台计算机的主要部分。CPU 主要通过触发器实现高低电平的转换。高低电平用脉冲信号进行传播,高电平用逻辑 1 表示,低电平用逻辑 0 表示,组合在一起就是我们所说的二进制。


逻辑运算就是在高低电平的基础上进行运算,下面这张图,我们称为数字波形图:



突出的部分就是高电平,也就是逻辑“1”,而直线部分是逻辑“0”,但在实际的数字系统中,数字信号并不规整,当矩形脉冲从高电平到低电平或低电平到高电平,边缘并没有这么陡峭,而要经历一个过渡的过程,为了方便作图而省略过度部分。


周期性数字波形图常用周期 T 和频率 f 来描述,脉冲波形的脉冲宽度用 t 表示,t 表示脉冲的作用时间,还有一个重要参数是占空比 q,表示脉冲宽度占整个周期的百分数,当占空比达到 50%的时候,矩形脉冲为方波,即 0 和 1 交替出现并持续占有相同的时间,这就是二进制的来源。关于二进制,在这就不详细介绍了,请关注后续文章。


逻辑运算,包括三种基本运算“与逻辑、或逻辑、非逻辑。”还有两种复合运算“同或、异或。”接下来一一讲解,为了方便理解,接下来会用图形的方式表示。



与运算可以理解为串联电路,上图是与逻辑电路图,电源 F 通过开关 L1、L2 向灯供电,只有 L1、L2 同时闭合时,灯才亮。L1、L2 中只要有一个断开或者两个都断开时,灯则熄灭,在这个电路中,开关 L1、L2 与灯的关系是,只有一个过程具备所有的条件,这个过程才会运行,这种关系称之为与逻辑。


如果用二进制逻辑 0 和 1 来表示以上开关和灯的状态,假设开关断开和灯不亮用逻辑 0 来表示,开关闭合和灯亮用逻辑 1 来表示,即可得出真值表。


简单来说,与逻辑可以总结为 0 出 0,全 1 出 1。用来实现与运算的电路叫做与门,下面是国际通用的与门符号。



通过线路 A、B 输入二进制字符,进行与运算,然后输出一位字符。


与运算则是串联电路,或运算正好相反,是一个并联电路。



上图所示是一个简单的或逻辑电路,电源 F 通过开关 L1 或 L2 想灯供电。只要开关 L1 或者开关 L2 任意一个或者全部闭合,灯就会亮。而当开关 L1 和 L2 全部断开的时候,灯则不亮。


此电路中开关 L1、L2 和灯之间的逻辑关系是,一个过程中的几个条件只要满足一个条件,这个过程就会运行,这种关系称为或逻辑。指 LI 闭合和 L2 闭合任一条件达成或者全部达成,根据以上条件,即可得到真值表。


简单来说,或逻辑可以总结为有 1 出 1,全 0 出 0。


用来实现或逻辑运算的电路叫做或门,如下图。



通过线路 A,B 输入二进制字符,进行或运算,然后输出一位字符。


非逻辑和与、或逻辑不同的是,非逻辑是取反运算。



如上图,电压通过一继电器触电向灯供电,A 为继电器的触点,即通常 A 不通电,触点自动闭合,灯亮,而当 A 通电时,触点自动断开,灯则不亮。由以上条件可知,非逻辑为相反条件。这个逻辑关系为非逻辑。


若用 0 和 1 来表示继电器和灯的状态,A 不通电和灯不亮用 0 表示,相反,A 通电和灯亮用 1 表示,则得出非逻辑的真值表。


简单来说,非逻辑可以总结为有 1 为 0,0 为 1。同样,用来实现非逻辑的电路叫做非门。



通过线路 A、B 输入二进制字符,进行非运算,然后输出一位字符。这个要特别注意前面的小圆点,这是非逻辑的特殊标识,在以后的逻辑电路中会频繁用到。


在实际运算中,除了与、或、非三种基本运算外,还会涉及一些其他的基本组合逻辑运算,如与非,或非,同或,异或等。


与非运算是与运算和非运算的组合运算。



A          BL
0          01
0          11
1          01
1          10


上面是与非的真值表,可以看出,与非逻辑是与逻辑的相反值。或非运算是或运算和非运算的组合运算。



A         BL
0         01
0         10
1         00
1         10


上面是或非的真值表,可以看出,或非就是或逻辑的相反值,还有两个比较特殊的基本组合逻辑运算,异或和同或。异或的逻辑关系是,当输入两个状态相同时,输出为零,当两个输入状态不同时,输出为一。



A              BL
0              00
0              11
1              01
1              10


上面是异或的真值表,相同为 0,不同为 1,接下来是同或逻辑:



A            BL
0            01
0            10
1            00
1            11


以上是逻辑的一些基本原理,但真正在计算机里并不是这个样子,而是用三极管进行控制,当然原理是一样的。


CPU 识别高低电平,然后做出逻辑运算,由于时间问题,三极管之类的就不多说了,只要理解上面的一些抽象电路即可,想要深入研究,请关注之后的文章或者了解一些计算机硬件知识。



上面是两道波形图(本人画的,原谅我,已经尽力了),通过上下两条电平对比,上面的转换二进制为 0101010,下面的转换二进制为 0010010。接下来就看看如何对上面的图进行逻辑运算。


先来看逻辑与运算,逻辑与的规则上面总结了,有 0 出 0,全 1 出 1,所以用与逻辑可以概括为 0000111。这组二进制就是把上面的两幅波形图用与逻辑合二为一,就是下面这幅图。



这里可能有人会说,结尾是高电平,为什么要把图画下来,其实这些都是为了视觉体验,让人看上去舒服一些,所以用了一条稍短的线,不算数的。然后就是或逻辑,算法同上,不过就是按照或逻辑的规则,有一出一,全零出零,结果为 0111010,这个就不做图了,打架可以在纸上画画,稍作理解,还有非运算,非运算由于是相反值,是没有办法对两组波形图进行运算,只能对一组数据取相反值。


这些就是逻辑的一些原理,属于计算机硬件和软件公用的一部分,这些只是基础部分,之后会涉及到一些组合逻辑电路,微机原理,还有汇编语言方面的问题。


2019-09-03 08:339756

评论

发布
暂无评论
发现更多内容

博睿数据首批加入云科通明湖生态联盟,赋能信创生态谋未来

博睿数据

领域驱动设计(DDD)靠谱么?

架构精进之路

DDD 4月日更 4月月更

Java 在 IntelliJ IDEA 中提示 set the language level 9

HoneyMoose

[Day9]-[动态规划]编辑距离

方勇(gopher)

LeetCode 动态规划 数据结构算法

【高并发】解密导致并发问题的第三个幕后黑手——有序性问题

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

在线XML转JSON工具

入门小站

工具

怒肝 JavaScript 数据结构 — 栈篇(二)

杨成功

数据结构 4月月更

焱融看|AI 如何驱动存储发展

焱融科技

云计算 AI 分布式 高性能 文件存储

预约中,2022京东云产业融合新品发布会线上开启

京东科技开发者

云计算 京东云 产品发布会 直播预约

圆桌派来啦!与行业大咖聊聊Dapr的发展与实践

行云创新

云原生 dapr

数字产业化快于产业数字化?

WorkPlus

传统链游的革新,PlatoFarm用实际行动回馈Dao社区

BlockChain先知

linux之ssh命令

入门小站

Linux

互联网的下一站,大概率是能源

脑极体

【Zeekr_Tech】汽车软件敏捷开发和分支管理

Zeekr_Tech

敏捷开发 智能驾驶

Hoo虎符研究院|一图了解币圈后浪Magic Eden

区块链前沿News

虎符研究院

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

crudapi

oracle 零代码 API crud 增删改查

Redis集群架构剖析(5):复制与故障转移

非晓为骁

主从复制 redis cluster master

从分层架构到微服务架构(五)之服务化架构

元闰子

架构 从分层架构到微服务架构

足不出户,搞定交付——独家交付秘籍(第二回)

阿里巴巴云原生

Apache flink - PartitionNotFoundException

印哥爱学习

flink 消费 kafak 错误排查

云上MongoDB常见索引问题及最优索引规则大全

MongoDB中文社区

mongodb

C++后端开发进阶学习大纲指南

赖猫

c++

Go 实现 WebSockets:1.什么是 WebSockets

宇宙之一粟

Go 4月月更

提升职场竞争力!低代码开发师(高级)认证发布

一只大光圈

低代码 数字化 钉钉宜搭 宜搭

netty系列之:netty中的核心解码器json

程序那些事

Java Netty 程序那些事 4月月更

微信朋友圈的高性能复杂度

哈喽

「架构实战营」

C++11 智能指针之shared_ptr<void>

轻口味

c++ android 4月月更

中国SaaS的增长真相|ToB大师课

ToB行业头条

适合中小企业的知识库软件有哪些?

小炮

知识管理

我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制

Java工程师

Java spring 程序员 科技

逻辑运算系列(一):入门篇_语言 & 开发_周澳_InfoQ精选文章