NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

  • 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:339758

评论

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

VIVO一面竟然翻车,含泪整理了这些Java面经,看完我悟了

Java 程序员 后端

Spring源码解析(一)IOC,终于找到一个看得懂的JVM内存模型了

Java 程序员 后端

zookeeper之java API使用,zookeeper学习

Java 程序员 后端

“打工人”都在用的邮件使用规范,springcloud架构源码

Java 程序员 后端

Spring源码学习~循环依赖(面试必问系列,学java基础的心得体会

Java 程序员 后端

Spring经典面试题,帮你整理好了!,阿里P8大牛亲自教你

Java 程序员 后端

[译] 微服务的设计模式,java后端面经

Java 程序员 后端

《JVM系列》 第六章 -- 对象的实例化与内存布局

Java 程序员 后端

Spring经典面试题,帮你整理好了!(1),一个星期4轮面试终拿下offer

Java 程序员 后端

Spring总结以及在面试中的一些问题,java面试笔试题代码

Java 程序员 后端

T-SQL——数据透视和逆透视,java架构师面试答案

Java 程序员 后端

Vue 脚手架结合 SpringBoot 构建前后端分离入门项目(实现增删改查)

Java 程序员 后端

windows下快速安装nginx 并配置 开机自启动,基础+底层+算法+数据库

Java 程序员 后端

Spring中注解,java电话面试技巧

Java 程序员 后端

Tomcat是如何运行的?整体架构又是怎样的?,java面试经验技巧

Java 程序员 后端

“我骑着我心爱的小摩托,他又在这里翻车了,mybatisdao接口工作原理

Java 程序员 后端

《深入理解Java虚拟机 3》类加载机制与字节码执行引擎

Java 程序员 后端

Spring入门后半部分----JDBCTemplate和事务控制

Java 程序员 后端

YYDS,瞬间秒杀全网,这套Java面试笔记可以解决90

Java 程序员 后端

Tomcat服务器搭建及测试教程,java技术路线规划

Java 程序员 后端

《深入理解Java虚拟机 1》Java内存区域与内存分配策略

Java 程序员 后端

Spring中的循环依赖及解决,springboot入门与实践PDF

Java 程序员 后端

super与this在成员变量,成员方法,构造方法方面的作用

Java 程序员 后端

Threadtear:一款多功能Java代码反混淆工具套件

Java 程序员 后端

VirtualBox虚拟机网络设置(四种方式),java高级程序员简历

Java 程序员 后端

Web开发基础:HTML,java面试没问技术问题

Java 程序员 后端

“三次握手,四次挥手,java程序设计教程第三版雍俊海pdf

Java 程序员 后端

《Spring实战》读书笔记-第2章 装配Bean,kafka调优面试

Java 程序员 后端

《恋上数据结构第1季》B树,java基础案例教程第二版答案

Java 程序员 后端

Spring动态代理时是如何解决循环依赖的?为啥用三级缓存?

Java 程序员 后端

《恋上数据结构第1季》二叉树代码实现,mongodb持久化原理

Java 程序员 后端

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