编程 条件转移的底层逻辑、逻辑表达式与串、并联电路和德摩根规则

我们知道,二进制可以用门电路来表示,二进制计算可以用实现布尔代数开关电路来表示。

我们知道,计算机对非数值问题的处理的关键在于其能处理分支和循环。

处理分支和循环是根据某一条件表达式的结果为true或false来处理的(C语言以非0表示true)。

我们知道,汇编语言中的分支和循环是通过跳转指令(条件转移指令)来完成的,条件表达式(如关系表达式的比较运算)的结果如何确定跳转呢?

“条件转移指令”执行时会自动引用标志寄存器的相应标志位的值来决定是否需要“转移”。

在计算机中,条件表达式的比较运算是通过减法运算的结果(与0比较及是否溢出)来改变标志寄存器的某些标志位,分支或循环指令再根据相应标志位的值来确定如何跳转或转移。

编程 条件转移的底层逻辑、逻辑表达式与串、并联电路和德摩根规则

16位CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布上图所示。

上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受算术运算和逻辑运算结果的影响,后者受一些控制指令执行的影响。

有些指令的执行会改变标志位(如:算术运算指令等),不同的指令会影响不同的标志位,有些指令的执行不改变任何标志位(如:MOV指令等),有些指令的执行会受标志位的影响(如:条件转移指令等),也有指令的执行不受其影响。

我们知道,关系表达式的结果为逻辑值,当表示复杂关系时,可以使用逻辑运算符(以逻辑值为操作数)来组合关系表达。

逻辑与、逻辑或的运算可以结合串联电路、并联电路来理解:

编程 条件转移的底层逻辑、逻辑表达式与串、并联电路和德摩根规则

逻辑表达式取非的分解可以借助德摩根规则(De Morgan's Rules)来理解:

!(A && B) is equivalent to !A || !B

!(A || B)is equivalent to !A && !B

如:

double sqrt(double y,double x)
{
    if(x*x-y>1e-5 || x*x-y<-1e-5)
        return sqrt(y,(y/x+x)/2);
    return x;
}

demo code:

#include 
#define EPSILON 1e-5
double sqrt1(double a,double x0){
    double x1 = (x0+a/x0)/2.0;
    if((x1*x1-a)>EPSILON || (x1*x1-a)<-EPSILON)
        return sqrt1(a, x1);
    return x1;
}
double sqrt2(double a,double x0){
    double x1 = (x0+a/x0)/2.0;
    if(!((x1*x1-a)-EPSILON))
        return sqrt2(a, x1);
    return x1;
}
double sqrt3(double a,double x0){
    double x1 = (x0+a/x0)/2.0;
    if((x1*x1-a)-EPSILON)
        return x1;
    return sqrt3(a, x1);
}
int main()
{
    printf("%f
",sqrt1(2.0,1.0));
    printf("%f
",sqrt2(2.0,1.0));
    printf("%f
",sqrt3(2.0,1.0));
    getchar();
}
/*
1.414216
1.414216
1.414216
*/

-End-

展开阅读全文

页面更新:2024-05-05

标签:表达式   电路   逻辑   条件   寄存器   算术   底层   分支   指令   标志   规则   关系

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2008-2024 All Rights Reserved. Powered By bs178.com 闽ICP备11008920号-3
闽公网安备35020302034844号

Top