计算机基础知识-第4章-真值表和逻辑运算、位运算 一、真值表与逻辑运算真值表真值表是什么呢我们来看百度百科的定义。表征逻辑事件输入和输出之间全部可能状态的表格。列出命题公式真假值的表。通常以1表示真0 表示假。命题公式的取值由组成命题公式的命题变元的取值和命题联结词决定命题联结词的真值表给出了真假值的算法。这个看着很拗口是吧。我们来举个例子吧。比如我们的目的是明天出去玩但是有几个条件第一是否加班第二是否晴天我们把各种情况列在一起就是一个真值表。是否加班是否晴天是否出去玩是是否是否否否是是否否否在这里各种情况和最终结果就一目了然了。是否出去玩这个命题的结果就由是否加班和是否晴天两个变量共同作用。如果我们把里面所有的是都认为是真用1代表所有的否都认为是假用0代表那么就变成了这样。是否加班是否晴天是否出去玩110100001000这就是一个真值表表明了两个变量共同作用得到最终命题的结果。这个式子可以写成只有当不加班并且晴天的时候才会出去玩。我们将影响一个结果的因素列出来用1表示真用0表示假就得到了真值表。真值指的就是表中每一项的真假。在计算机中我们一般考虑的是是真是假大部分情况下我们认为0代表假其他一切非0比如1或者其他正整数、负整数甚至小数都可以表示真。所以一般简单归类就是0和非0也就是用1代表一切非0就好了。逻辑运算逻辑运算是什么呢我们还是来看一下百度百科的定义吧。逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题成功地建立了逻辑演算。他用等式表示判断把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释只依赖于符号的组合规律 。这一逻辑理论人们常称它为布尔代数。20世纪30年代逻辑代数在电路系统上获得应用随后由于电子技术与计算机的发展出现各种复杂的大系统它们的变换规律也遵守布尔所揭示的规律。逻辑运算 (logical operators) 通常用来测试真假值。最常见到的逻辑运算就是循环的处理用来判断是否该离开循环或继续执行循环内的指令。逻辑运算又称布尔运算因为是布尔发明的。简单的说就是基于真值表的运算通过对运算过程中所有变量的真值的推导得到结果。逻辑运算一般结果只有真或者假也就是1或者0。这段话还有一点要注意也就是逻辑运算运用在电路上如果你的初中物理学的还可以那么理解起来会很容易的。最基本的逻辑运算与、或、非。其他的运算都是在这三个基础上做排列组合。与运算与运算用and或者表示运算需要两个运算数比如10510。与运算指的是只有当参加运算的两个数字都是真结果才是真其他一切情况都是假。与运算真值表CABABC000100010111与运算的本质是什么呢是两个开关串联。不知道你对初中电路还记得多少。与运算相当于两个开关串联在一起只有全部都处于联通状态也就是真状态灯泡才能亮结果为真只要有一个是断开的也就是假状态灯泡就不亮结果为假。或运算或运算用or或者||表示运算需要两个运算数比如1||02||7。或运算指的是参加运算的两个数字至少有一个为真结果就为真。或运算真值表CA||BABC000101011111或运算的本质是两个开关并联。至少有一个开关处于联通状态灯泡就能亮只有当两个都断开灯泡才不能亮。非运算非运算用not或者~表示运算只需要一个运算数比如~1~19。非运算指的是反转运算数的真值真的变成假的假的变成真的一般来说我们喜欢把1变成00变成1如果你喜欢也可以变成任何其他的非0数字。非运算真值表B~AAB0110非运算的本质是开关短路灯泡如果开关没有联通灯泡可以亮如果开关联通灯泡被短路不能亮了为防止把电池烧了电路要加电阻还记得吗。其他逻辑运算还有很多其他的逻辑运算但都是这三种的组合比如与或就是先与再或或非就是先或再非只要细心按照顺序算下来都是没问题的。逻辑运算在电路中的应用——逻辑电路逻辑电路是最简单的数字电路更复杂的还有带时序的组合电路数字电路基本上就是纯粹的逻辑与历史时刻的输入和时钟信号没有关系。逻辑电路中使用的就是与、或、非、与或、与非等等逻辑。在电路中一个基本的逻辑单元叫做一个门比如与门、或门、非门、与或门等等为什么叫门呢我也不知道大概是觉得输入进了这个门就变成了输出吧。所以用以实现基本逻辑运算和复合逻辑运算的单元电路也称为门电路。在电路中一般用这些符号左侧代表输入有几条线就是有几个输入右侧代表输出仔细观察可以发现输出带有小圆圈的都是带非门的。哦对了在这里说一下异或和同或异或指的是两个数字不同结果为1相同结果为0同或刚好放过来相同为1不同为0。异或ABC000011101110同或ABC001010100111比如这就是一个很简单的逻辑电路这是一个全加器电路将输入A和B与进位Cin加到一起输出这一位结果和下一位进位。看最下面那个式子那就是这个电路要做的事情数字逻辑有自己的符号。二、位运算好啦学完了逻辑运算我们来学位运算。位运算是什么计算机中存储的任何信息都是二进制的位运算就是以位为单位对数据进行处理处理的逻辑和逻辑运算一样就是对每一位依次进行逻辑运算。与、或、非是最基础的三种位运算方式但一般叫做按位与、按位或和非指的都是一位一位进行运算而不是整个数字作为真值来运算。最基础的位运算-按位与、按位或、非按位与按位与一般用符号表示注意这里只有一个比如57611按位与指的是两个数字的每一位相与只要有一个是0结果就是0只有两个都是1才能是1。我们以57为例遵循同为1结果才为1的原则即可按位或按位或运算用|表示注意只有一个|比如11|20按位或指的是两个数字每一位进行或运算只要有一个1结果就是1两个都是0结果为0非非运算一般用~表示这个就只有一个非指的是数字每一位都取反0变成11变成0比如~18其他位运算其他还有很多位运算方式比如按位异或按位同或这些你应该可以直接理解了。这里要讲的是移位运算。移位分为左移和右移在很多编程语言中右移更加复杂比如c语言分为右移和循环右移是基于数字在内存中的存储方式和你的需要来选择的。这里只是讲一下最简单的左移和右移的原理。左移左移一般用来表示AB就表示要把数字A的每一位都向左移B位比如32所有数字左移之后低位补0高位溢出就溢出吧你现在还不用考虑高位溢出该如何处理就直接照抄就好了。3左移2位后变成了12很神奇吧3*212准确的说是3*2^212这就是左移的意义左移多少位就相当于乘以2的多少次方代码里经常这样因为移位操作比乘法快原理就是图上的你把一个二进制数字左移就相当于给每个数字所对应的权重增加了几次幂所以最后这个数字加在一起就相当于乘以2的多少次幂。右移右移和左移是相对的一般用表示AB就表示要把数字A右移B位这里涉及到一个问题右移的话低位数字怎么办这个你暂时不用考虑我们先用低位为0的数字举例比如164右移高位补0因为这里的低位数字为0所以可以毫无顾忌地右移。和左移相反右移就相当于把数字除以2的若干次幂道理很简单右移就是把数字的位的权重降低所以就变小了。16/2^41。程序员一般用左移和右移来实现对2的乘法或者除法因为移位的速度远比乘除法快得多。右移会涉及到低位问题c语言的处理是有两种处理方式一种是右移低位无条件舍掉不要了另一种是循环右移右侧的低位会被补充到左侧高位但这样又会产生很多问题等到时候你就会知道了所以选择使用哪一种要很慎重。三、总结这一章讲了真值表就是各种真假情况和对应结果的罗列然后引出了逻辑运算基本上掌握与或非三种最基本都就行后面讲了位运算位运算一部分是基于逻辑运算的和逻辑运算一样只要记住按位就好啦最后讲了位移这都是编程尤其是底层系统编程常用的技巧只要理解了就很容易掌握的。