74151/74LS151 8选1数据选择器

逻辑符号

功能表

Y和Y非负责输出,EN为0(即EN非为1)时,置零,EN为1时,正常工作。

A2A1A0组成一个二进制数,下标为这个二进制数对应的十进制数的D从Y输出。

858-759-8913

移位

移位,即乘以2^n,n为整数。移位时不改变符号为。

对于整数,原,补,反三者相等,故移位后,空位补0。对于负数,遵循下表规则。

例:补码1,11001左移一位得1,10010,右移一位1,11100

加法与减法

基本公式:一位符号位,符号位参与运算,运算完成后丢弃超出按2^(n+1)取模(整数)或者按2^n取模(小数)

例:

因为最高位进位了,所以要丢掉进位得到的1。

但这样子有个问题,如

[A]补=0.1111  [B]补=0.0010,AB相加得到了1.0001。两个正数相加得到了负数,说明数据溢出了。

溢出判断:

加法中,只有正数加正数或者负数加负数才会溢出;

减法中,只有负数减正数或者正数减负数才会溢出。

判断方法:两位符号位。

运算前,两位符号位同为1或0。运算时,符号位参与运算。运算完成后,若符号位依然为11或00,无溢出。

若不同,高位的符号位表示真实情况。01,高位为0,是正数,为正溢出。反之为负数,负溢出。

乘法运算

原码一位乘

两数相乘,可以看作是加法和移位两种运算。

例:A=0.1101,B=0.1011,求A*B

如图,最后一行最里面的括号,里面的0代表部分积,一开始为0

然后从B的最低位开始看起。因为B的最低位为1,所以部分积要加上A,即0.0000+0.1101得到新的部分积0.1101。

然后部分积右移一位,保留最低位,B右移一位,不保留最低位,得到部分积:0.01101和B:0.0101。

重复加粗自然段的操作,0.01101+0.1101=1.00111

接下来,B右移后最低位为0,所以部分积只移位,不加A。

最后,B最低位为1,部分积加A。

最后部分积右移一位,得到最终结果。

 

总结:初始化部分积为0.0000(实际位数由乘数与被乘数决定,例子中为4位数值位),然后从最低位,依次看B的那一位是什么。如果是1,部分积加A然后右移,如果为0,部分积只进行右移。

 

上面的是原码一位乘。这种方式虽然易于理解,但在面对字节较长的数据时,效率有点低,这时就要用原码两位乘。

原码两位乘

类似于一位乘,也是先令部分积为0,然后根据乘数后两位以及被乘数本身来对部分积进行操作。乘完一次,乘数与部分积右移两位。

而符号位在运算时初始为0,数值位算完后再根据乘数与被乘数得出实际符号。

具体运算方式如下

z为部分积,x*表示被乘数绝对值,y*表示乘数绝对值。进行-x*时,一般通过加[-x*]补来实现。因为运算时可能会加两倍被乘数,即加[2x*]补,所以部分积绝对值可能会超过2,因此要三个符号位。

Booth算法

被乘数x与乘数y均为任意符号,通过校正法算出答案。

设[x]è¡¥=x0.x1x2x3…xn

[y]è¡¥=y0.y1y2y3…yn

运算公式为[x*y]è¡¥=[x]è¡¥(y0.y1y2y3…yn)-[x]è¡¥*y0

当y0=0时,结果即为 [x]è¡¥(y0.y1y2y3…yn)

y0=1时,结果为 [x]è¡¥(y0.y1y2y3…yn)-[x]è¡¥

于是,得到以下递推公式

其中yn+1=0

总结来说,就是根据高位减低位的值来决定如何对部分积进行运算,如果为0,只移位,如果为1,加[x]补再移位,如果为-1,减[x]补再移位

除法运算

小数定点除法对除数与被除数有约束

0<|被除数|<=|除数|

恢复余数法:

除法实际上是不断比较x*与y*,即xy的绝对值。每次用x*-y*,如果大于0,上1,如果小于零,则上0,并让被乘数加回y*。每次商上一位后,被除数左移一位。因为计算机只有加法器,所以-y*要化位+[y*]补

而且要注意的是,上商是上在商的低位,如商为1101,上0后,变为11010

至于商的符号位,只与xy符号位有关,由xy的符号位异或得来。

例

x原=1.1011,y原=1.1101

则x*=0.1011,y*=0.1101

同理,假如余数为正,就省去恢复余数那一步,商进1,被除数(或者说余数)左移一位继续运算。

加减交替法:

上面一种方法,x*移位后永远是减去y*,而这一种,则根据余数正负决定如何运算

余数为正,依然上1,余数为负,依然上0。但是,上完商后立马左移,然后,余数为正,就+[-y*]补,余数为负,就+[y*]补

例

x原=1.1011,y原=0.1101,所以[-y*]补=1.0011

(236) 382-6008

无符号数:即最简单的二进制数,一定为非负数

原码:原码分符号位和数值位,数值位和无符号数一样,表示绝对值大小,是非负数,而符号位为0表示正数,符号为1表示负数。符号为长度预先规定,一般为一位或两位。

补码:整数补码定义为

即,原码大于零时,补码不变,原码小于零时,原码如图进行运算

小数的补码定义类似

按照定义运算过于麻烦,原码补码互相转换的技巧为:对于非负数,不变,对于负数,符号为不变,所有数值位反转后,加1

例:原码=1,1101,补码=1,0010+1,0001=1,0011。补码转回原码也是同样的操作。

反码:与原码类似,只不过只需要反转数值位,不需要加1。

 

原码方便人理解和计算,但对于计算机,原码运算过于麻烦,所以使用补码。而反码一般只是原码与补码互换时的过度

数的定点表示和浮点表示

定点表示

定点表示有两种方式

数符表示正负,0为正,1为负

对于小数点在数值前面的,为小树,写作x.xxxxxxx

对于小数点在数值后面的,为整数,写作x,xxxxxxx

例:0.101=5/8

由于小数点位置固定,所以,计算机处理的数既有小数部分又有整数部分时,就要乘以一个比例因子,防止溢出。

浮点表示

浮点数N通常表示为

N=S*(r^j)

用计算机存储方式如图

阶码j为整数,尾数S为小数。因为阶码j和尾数S其实本身为整数,所以两者也有数符位和数值为。

此外,称尾数最高位为1的数称为规格化数,即S部分形如0.1xxxxxxxx。浮点数表示为规格化形式后,精度最高。

vector动态数组

定义:vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。——《百度百科》

头文件:#include <vector>

声明方法:vector<数据类型>数组名

使用时和其他数组一样,从零开始计数,用数组名加下标。但因为这是动态数组,所以有一些特有的函数

函数:void push_back(const &T X),向尾部加入一个元素X

如

  1. vector<int>a = { 1,5,2,7 };
  2. a.push_back(8);
  3. cout << a[4];

最终输出结果为8。

int size(),返回数组元素个数。

以上面那个数组为例,三条语句执行完后,a.size()的值为5。

void pop_back(),删除向量中最后一个元素

void clear(),清空向量中所有元素

866-868-4478

设连续性随机变量X的概率密度为ƒ(X),随机变量Y=g(X)

则Y的分布函数为

Iy为g(x)<=y时x的取值范围

 

但这种方法比较麻烦,对于且仅对于单调的g(x),有另一种求法

Y的概率密度为

α为g(x)的最小值,β为g(x)的最大值,x=h(y)为y=g(x)的反函数

(774) 766-9830

一、逻辑代数基本公式

1、常量与变量关系公式

A•1=A,A•0=0,A+1=1,A+0=A

也就是说,“•”表示与,“+”表示或。

一个命题加上横线表示非。

2、变量之间关系公式

•与+都符合交换律,结合律和分配律

互补率:

重叠率:A+A=A,A•A=A

还原律:

反演律:

3、常用公式

1)

A+A•B=A,A•(A+B)=A

证:A+A•B=A•(1+B)=A•1=A

2)

3)

4)

A•(A+B)=A

证:A•(A+B)=A•A+A•B=A+A•B=A•(1+B)=A

5)

6)

二、逻辑函数及其表达方式

对于一个确定的逻辑式,当其中的逻辑变量A、B、C……确定之后,其输出变量的值也被唯一地确定了,即Y与ABC……之间构成了函数关系,称Y为A、B、C……的逻辑函数,记作

Y=F(A,B,C……)

我们所讨论的都是二值逻辑函数,即ABC等变量只能取0或1。

函数表示方法:

表示方法有许多,这里只介绍三种

1,真值表法

即列出所有变量与Y,在下面写出每一种可能情况,一种情况占一行,同时写出这种情况下的Y值

2,逻辑函数式

把输出与输入之间的关系,写成与或非的组合式,即得到了函数式

如同或运算的真值表为

则可以写为

3,逻辑图

将与或非等符号用图形符号表示出来,如,还是以同或为例

如图可见,当AB同时为0或1时,Y为1

三、逻辑函数的公式简化法

对于同一个逻辑函数,有多种写法,比如下面这两个就是同一个逻辑函数

化简,就是为了合并删除一些多余的项

简化法:

1,并项法

利用公式

消除B和非B。

由替代原理可知,B可替换为一个复杂逻辑式,例

这个式子中,B为Ā•B

2,吸收法

利用公式A+AB=A,消去AB

例

3,消项法

利用

4,配项法

利用A+A=A和A+Ā=1

5,消因子法

利用公式

四、逻辑函数的卡诺图化简

1、卡诺图的构成

将n变量逻辑函数的全部最小项各用一个小方块表示,并使具有逻辑相邻性的最小项在几何位置上也相邻地排列起来,所得图形为n变量卡诺图

例

如图,abcd就是二到五变量的卡诺图

在制作卡诺图时,有一原则,相邻行(列)的标注只能有一个数字不同,所以在五变量卡诺图中,001下一位不是010而是011。

m的下标是所在行与所在列的二进制数首尾相连得到的二进制数所对应的十进制的数。

2、用卡诺图表示逻辑函数

将逻辑函数化为由最小项组合而成的逻辑函数,然后假如这个最小项存在,就在卡诺图中将对应方块标为1.

例:

3、用卡诺图化简逻辑函数

简化方法,用1×2或2×2或2×4的矩形,将每一个为1的方块框起来,一个方块可以被框多次,每个框对应一个化简后的项

而每个框的内部,都只保留公共项。

例;

对于那个1×2的矩形,里面是

其他形状的同理,只保留在这几个最小项中完全不变的变量。

五、具有无关项的逻辑函数及其化简

无关项:前面讨论的逻辑函数,其值与n个输入变量均有关,有2^n个输入变量的组合值。而实际情况中,函数取值只取决于其中的K个组合值,而与2^n-K个无关。而原因有两种

  1. 输入变量在这个逻辑函数中不允许或不可能出现,比如违反现实的假设
  2. 这几个组合值出现时对函数的输出没影响

例如:计算器只允许加法、减法和乘法中同时进行最多一种操作,即只有000,001,010,100四种情况,其余的都不存在。

一般,将函数输出值中不可能出现的最小项称为约束项

同时,还可能遇到在输入变量的某些取值下,函数输出可以是0也可以是1,则这些变量取值下,等于1的那些最小项称为任意项

约束项和任意项统称为无关项,在卡诺图中,用X表示无关项,无关项可以是0也可以是1。

化简:

化简时,X的取值要视具体情况。应以得到的相邻最小项方格圈最大且全数最少为原则,

例:

其中,约束条件中的几项即为无关项,则卡诺图如图

原则是框大而少,所以将m3,m7视为1,m8视为0,得到最终结果为

谈盗版

一群人,成天吃霸王餐,还洋洋得意,嘲笑吃饭付钱的人;或者不论商家是否允许,是任何东西都要先试吃一大口,然后再视情况决定买不买;甚至说,一个小偷,被凭自己劳动赚钱的人鄙视了,结果小偷说鄙视自己的人是看到自己免费得到东西所以发酸。

是不是觉得上面的情况极其扯淡?然而,这就是国内某些玩家的写实。只玩盗版;或者玩了盗版视情况补票;或者嘲笑买正版鄙视盗版的人为正版侠或者是他们在秀优越。

你一旦说他们,他们就会说:“你没用过盗版啊?”“你家里Windows视正版?”一个个理直气壮。且不论我用不用盗版,你自己用盗版,有什么好秀的呢?

国内正版意识差,许多软件方面游戏方面的非实体产品没考虑到我们发展中国家人均消费水平,所以用盗版不说支持,也算是无可厚非(意指说话做事虽有缺点,但可以予以谅解,加注释防文盲杠精)。但自己闷声发大财自知理亏不好吗?看到各种讨论视频,底下的评论区总有人大言不惭地说自己玩的是盗版并觉得这个游戏很垃圾。在“pc上玩塞尔达”的视频下面,总有人洗地,说up主(上传视频的人)已经买了游戏,你们正版侠叫什么叫。可你们知不知道,你买游戏只有使用权,没有随意传播宣传盗版的权利,不然,我买票看电影,就能盗录电影了?

更可笑的是,在这些盗版玩家中,还不乏对国产游戏说三道四指点江山的人。不是说国产游戏不能批评,但你这种都没用实际行动和实际的金钱支持国产支持优秀游戏的人,哪来的脸批评被你占便宜的人?

知不知道为什么游戏公司中腾讯营收全球第一却没做出自己的3A大作?审核是一方面,消费者构成就不是了吗?为什么国内厂商都挤着去做手游页游?还不是因为做这些游戏有利润。做个平庸的手游成本低,周期短,不费事,人员少,有经验,上线之后雇一些托刺激玩家消费,钱就大笔大笔地来。你真想要国产游戏,尤其是国产3A大作早日起来,与其痛骂,还不如用实际行动,多安利几个人,尽可能原价买游戏。

扯得有点远。我写这个只是抒发一下心中地不快,同时希望各位目前还在玩盗版的人,尽量支持正版吧,打折买都行。不要等到全球都没几个公司研发3A大作而全部改行做手游时,才知道后悔,毕竟。国内已经被十多年前的盗版潮毁成如今这样了

610-983-5226

1)

printf()类型为整形数据,返回值为输出的字符串长度。

例如

  1. int a;
  2. a=printf(“123456”);
  3. cout<<endl;
  4. cout<<a;

运行结果为:

123456

6

也就是说,必须执行输出,然后才返回值

2)

函数中,参数传递依靠栈实现,所以从右到左依次压栈

如

  1. int a(int b)
  2. {cout<<b;
  3. return b+1;}
  4. int aa(int x,int y,int z)
  5. {cout << endl;
  6. cout << x + y + z << endl;
  7. return 0;}
  8. int main()
  9. {int a1=0,a2=0,a3=0;
  10. aa(a1=a(1),a2=a(2),a3=a(3));
  11. return 0;}

则输出结果为:

321

9

3)

#define 在执行时是进行简单的替换,例:

  1. #define N 2
  2. #define M N+N
  3. c=M/M

按照人的思考方式,c=1,但是,编译器执行的是

c=N+N/N+N=2+2/2+2=5