精华内容
下载资源
问答
  • 标志位flag用法
    千次阅读
    2017-02-23 21:32:14

    运算结果标志位

    1、进位标志CF(Carry Flag)

    进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
    使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。

    2、奇偶标志PF(Parity Flag)

    奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
    利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。

    3、辅助进位标志AF(Auxiliary Carry Flag)

    在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
    (1)、在字操作时,发生低字节向高字节进位或借位时;
    (2)、在字节操作时,发生低4位向高4位进位或借位时。
    对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

    4、零标志ZF(Zero Flag)

    零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

    5、符号标志SF(Sign Flag)

    符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

    6、溢出标志OF(Overflow Flag)

    溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
    “溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

    状态控制标志位

    状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

    1、追踪标志TF(Trap Flag)

    当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
    指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

    2、中断允许标志IF(Interrupt-enable Flag)

    中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
    (1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
    (2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
    CPU的指令系统中也有专门的指令来改变标志位IF的值。

    3、方向标志DF(Direction Flag)

    方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

    更多相关内容
  • 驱动六路电机开关和走动 因为要驱动6个电机 所以不能控制一个电机直接关掉ET0 所以想用flag来当中断开关#includetypedef unsigned char BYTE;typedef unsigned int WORD;BYTE flag1;BYTE cache,count;sbit DIR=P0^5;...

    驱动六路电机  开关和走动        因为要驱动6个电机 所以不能控制一个电机直接关掉ET0   所以想用flag来当中断开关

    #include

    typedef unsigned char BYTE;

    typedef unsigned int WORD;

    BYTE flag1;

    BYTE cache,count;

    sbit DIR=P0^5;

    //sbit SLP=P1^0;

    sbit  flag = P2^7;

    sbit STEP=P0^4;

    sbit EN = P0^0;

    sbit M1 = P0^1;

    sbit M2 = P0^2;

    sbit M3 = P0^3;

    //sbit EN=P1^3;

    void Timer0Init(void)                //100微秒@11.0592MHz

    {

    AUXR |= 0x80;                //定时器时钟1T模式

    TMOD &= 0xF0;                //设置定时器模式

    TL0 = 0xAE;                //设置定时初值

    TH0 = 0xFB;                //设置定时初值

    TF0 = 0;                //清除TF0标志

    TR0 = 1;                //定时器0开始计时

    EA=1;

    //        ET0=1;

    }

    void UartInit(void)                //9600bps@11.0592MHz

    {

    PCON &= 0x7F;                //波特率不倍速

    SCON = 0x50;                //8位数据,可变波特率

    AUXR |= 0x40;                //定时器1时钟为Fosc,即1T

    AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器

    TMOD &= 0x0F;                //清除定时器1模式位

    TMOD |= 0x20;                //设定定时器1为8位自动重装方式

    TL1 = 0xDC;                //设定定时初值

    TH1 = 0xDC;                //设定定时器重装值

    ET1 = 0;                //禁止定时器1中断

    TR1 = 1;                //启动定时器1

    ES = 1;

    }

    void init()

    {

    EN = 0;

    M1 = 1;

    M2 = 0;

    M3 = 0;

    }

    void delay(WORD n)

    {

    WORD x;

    while (n--)

    {

    x = 5000;

    while (x--);

    }

    }

    void D1()

    {

    if(cache == 0xa5)

    {

    TR0 = 0;

    ET0 = 0;

    cache = 0;

    }

    if(cache ==0x50)

    {

    TR0 = 1;

    ET0 = 1;

    DIR = 1;

    cache = 0;

    flag1 = 0;

    }

    if(!flag )

    {

    DIR = 0;                           //向电机方向移动

    }

    }

    void send(BYTE dat)

    {

    SBUF = dat;                     //发送当前数据

    while (!TI);                    //等待前一个数据发送完成

    TI = 0;                         //清除发送标志

    }

    void main()

    {

    Timer0Init();

    init();

    UartInit();

    while(1)

    {

    D1();

    //        DIR = 1;

    //        flag1= 1;

    /*        if(flag1)

    {

    if(!flag)

    {

    delay(1);

    if(!flag)

    {

    DIR = 1;

    delay(500);

    }

    }

    }        */

    }

    }

    void timer0() interrupt 1

    {

    //        count++;

    /*        if(flag1 == 1)

    {

    STEP=0;

    }

    if(flag1 == 2)

    {

    STEP=~STEP;

    }  */

    STEP=~STEP;

    //        if(count >= 100)

    //        {

    //        count = 0;

    //        send(0x52);

    //        }

    /*if(flag==1)

    {

    t1++;

    if(t1>=35000)

    {

    t1=0;

    flag=2;                         //计时完成=2

    }

    }*/

    }

    void io() interrupt 4

    {

    if(RI)

    {

    RI = 0;

    cache =  SBUF;

    }

    }

    展开全文
  • TCP标志位详解(TCP Flag

    万次阅读 多人点赞 2017-09-14 11:38:12
    TCP的Flag标志位) 每个TCP段都有一个目的,这是借助于TCP标志选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。 您可以看到在3次握手(SYN,ACK)和数据传输期间使用的2个标志...

    每个TCP段都有一个目的,这是借助于TCP标志选项来确定的,允许发送方或接收方指定哪些标志应该被使用,以便段被另一端正确处理。

    我们来看看TCP标志字段来开始我们的分析:


    您可以看到在3次握手(SYN,ACK)和数据传输期间使用的2个标志。

    与所有标志一样,值“1”表示特定标志为“设置”,或者如果您喜欢,则为“开”。在此示例中,只有“SYN”标志被设置,表示这是新的TCP连接的第一个段。

    除此之外,每个标志长一位,由于有6个标志,所以标志部分总共6位。

     

     您必须同意最流行的标志是“SYN”,“ACK”和“FIN”,用于建立连接,确认成功的段传输,最后终止连接。虽然其余的标志帜不是众所周知的,但它们的作用和目的在某些情况下也同样重要。

    我们将开始分析,检查从顶部开始的所有六个标志:

     

    1 FLAG - 紧急指针(URGENT POINTER)

    第一个标志是紧急指针标志,如上一屏幕截图所示。此标志用于将输入数据标识为“紧急”。这样的进入段不必等待直到先前段被接收端消耗,而是直接发送并立即处理

    在数据传输流中,主机正在向远程机器上运行的应用程序发送数据,可以使用紧急指针。如果出现问题,主机需要中止数据传输,并在另一端停止数据处理。在正常情况下,中止信号将在远程机器发送和排队,直到所有先前发送的数据都被处理,但是在这种情况下,我们需要立即处理中止信号。

    通过将中止信号的段紧急指针标志设置为“1”,远程机器将不会等待所有排队的数据被处理,然后执行中止。相反,它会给出特定的段优先级,立即处理它,并停止进一步的数据处理。

    如果您发现很难理解,请考虑这个现实生活中的例子:

    在当地的邮局,数以百计的卡车正在卸载来自世界各地的信件。因为进入邮局大楼的卡车数量很多,他们排队一个,等待轮到他们卸下行李。

    结果,队列结束了很久。然而,一辆大红标志的卡车突然加入队伍,安全人员的工作是确保没有卡车跳过排队,看到红标志,并且知道它载有非常重要的信件,需要紧急到达目的地。按照正常程序,安全人员向卡车发出信号,跳过队列,一路向前,优先于其他卡车。

    在这个例子中,卡车表示到达其目的地并在等待处理的缓冲器中排队的段,而具有红标志的卡车是设置了紧急指针标志的段。

    另外要注意的是存在指针指针字段。这个字段在第5节中有所描述,但是我们可以简单地提到,当紧急指针标志设置为'1'(这是我们在这里分析的那个)时,紧急指针字段指定紧急数据结束的段中的位置。

     

    第二标记- 确认(ACKNOWLEDGEMENT)

    确认标志用于确认数据包的成功接收

    如果在使用TCP传输数据的同时运行数据包嗅探器,您会注意到,在大多数情况下,对于发送或接收的每个数据包,都会进行确认。因此,如果您从远程主机收到数据包,那么您的工作站最有可能将ACK字段设置为“1”。

    在发送方每发送一个数据包需要一个确认的情况下,接收端将发送一次预期的ACK(接收到第三个连续的数据包)。这也称为窗口化,并在以下页面中广泛介绍。

     

    第三标志 - PUSH

    存在推送标志,如紧急标志,以确保数据被给予优先级(它应得的),并在发送或接收端处理。这个特定的标志在数据传输的开始和结束时被非常频繁地使用,影响数据在两端处理的方式。

    当开发人员创建新的应用程序时,他们必须确保它们遵循RFC的特定指导,以确保其应用程序正常工作,并且无缺陷地管理进出OSI模型的应用程序层的数据流。使用时,推送位确保数据段被正确处理,并在虚拟连接的两端给出适当的优先级。

    当主机发送其数据时,它将暂时排队在TCP缓冲区中,即存储器中的一个特殊区域,直到该段达到一定大小,然后发送到接收器。这种设计保证数据传输尽可能高效,而不需要通过创建多个片段而不需要花费时间和带宽,而是将它们组合成一个或多个较大的片段。

    当段到达接收端时,它被传递到应用层之前被放置在TCP传入缓冲器中。在进入缓冲区中排队的数据将保留在那里,直到其他段到达,并且一旦完成,数据就被传递到等待它的应用层。

    虽然这个过程在大多数情况下运行良好,但是有很多情况下这种“排队”的数据是不期望的,因为排队期间的任何延迟都可能导致等待应用程序出现问题。一个简单的例子将是一个TCP流,例如真正的播放器,其中数据必须立即发送和处理(由接收器),以确保平滑的流,没有任何切断。

    这里提到的最后一点是,Push标志通常设置在文件的最后一段,以防止缓冲区死锁。当用于通过代理发送HTTP或其他类型的请求时也可以看到,确保请求得到适当和有效的处理。

     

    第4标志 - 复位(RST)标志

    段到达不用于当前连接时,使用复位标志。换句话说,如果要向主机发送数据包以建立连接,并且没有这样的服务等待在远程主机上回答,则主机将自动拒绝您的请求,然后向您发送回复RST标志置1。这表示远程主机已重置连接

    虽然这可能是非常简单和合乎逻辑的,但事实是在大多数情况下,这个“特征”被大多数黑客使用,以便扫描“打开”端口的主机。所有现代端口扫描仪都能够通过“复位”功能检测“打开”或“收听”端口。

    用于检测这些端口的方法非常简单:当尝试扫描远程主机时,将使用SYN标志位(1)构建有效的TCP段,并将其发送到目标主机。如果没有服务监听特定端口上的入站连接,则远程主机将回复ACK和RST标志设置(1)。另一方面,如果端口上有服务监听,则远程主机将构造一个具有ACK标志位的TCP段(1)。这当然是我们已经涵盖的标准三次握手的一部分。

    一旦主机扫描开放端口接收到该段,它将完成三次握手,然后使用FIN(见下文)标志终止它,并将特定端口标记为“活动”。

     

    第5标志 - 同步标志(SYNCHRONISATION FLAG)

    TCP标志选项中包含的第五个标志可能是TCP通信中使用最知名的标志。您可能会注意到,在建立两台主机之间的经典3次握手时,SYN标志是初始化的:


    在上图中,主机A需要使用TCP作为其传输协议从主机B下载数据。协议需要进行三次握手,以便双方建立虚拟连接才能交换数据。

    在三次握手期间,我们可以统计每个主机发送的SYN标志总数为2个。随着文件的交换和新连接的创建,我们将看到更多的SYN标志被发送和接收。

     

    第六标志- FIN 标志

    可用的最后一个标志是FIN标志,代表“完成”一词。该标志用于拆除使用上一个标志(SYN)创建的虚拟连接,因此,由于这个原因,当连接之间交换最后一个数据包时,总是出现FIN标志。

    重要的是要注意,当主机发送FIN标志来关闭连接时,它可能会继续接收数据,直到远程主机也关闭了连接,尽管这仅在特定情况下发生。一旦连接被双方削减,则释放用于连接的每端的缓冲区。

    正常的拆卸过程如下所示:


    上图显示了主机A和B之间的现有连接,两个主机正在交换数据。一旦数据传输完成,主机A发送一个包含FIN,ACK标志的数据包(步骤1)。

    使用此数据包,主机A确认先前的流,同时启动TCP关闭过程以终止此连接。此时,Host A的应用程序将停止接收任何数据,并将关闭此端的连接。

    为了响应主机A关闭连接的请求,主机B将发送确认(STEP 2),并通知其应用程序连接不再可用。一旦完成,主机(B)将发送自己的FIN,ACK标志(步骤3)以关闭其部分连接。

    如果您想知道为什么需要执行此过程,则可能需要记住,TCP是一个全双工连接,这意味着有两个方向的数据流。在我们的示例中,这是从主机A到主机B的连接流,反之亦然。另外,它需要两个主机关闭它们的连接,因此两个主机必须发送一个FIN标志并且另一个主机必须确认它的原因。

    最后,在步骤4,主机A将确认在步骤3发送的主机B的请求,并且双方的已关闭程序现在已经完成!


    原文地址:http://www.firewall.cx/networking-topics/protocols/tcp/136-tcp-flag-options.html

    展开全文
  • JavaScript基础教程之flag用法

    万次阅读 多人点赞 2018-01-10 20:58:36
    因为程序要实现的功能很多,为了区分各个程序段实现了什么功能就用标志位的值,然后使用if语句判断标志位的值,进入相应的程序实现相应的功能,当然flag的值由你来决定。 上面介绍了这么多,我们只需要知道: ...

    Write By Monkeyfly

    以下内容均为原创,如需转载请注明出处。

    前提

    今天学习了DOM基础方面的知识,可谓是收获颇丰。在重新认真学习JavaScript的过程,对比第一次学习而言,体会就是不一样。虽然整体感觉轻松了许多,但书中还是有很多细小琐碎的知识点值得思索和推敲。在我看来,有一本优秀的入门教程书是多么的重要,因为它不但会提升我学习的兴趣,而且可以促进我更快地学习和掌握知识。至少这本书是我目前为止碰到过的最好的JavaScript基础教程,没有之一。我并不是给这本书打广告,而是真心实意的推荐给大家,全名是《Web前端开发精品课之JavaScript基础教程》

    题外话

    当初在大学期间自学web前端的过程中,在图书馆借了很多有关HTML与CSS教程的书,在快速翻看完所有的书之后,选定了这本名为《Web前端开发精品课之HTML与CSS进阶教程》的书,然后就借回去学习了。最主要的原因还是外观吸引了我,对比同类的书,这本书外观新奇而且内容也符合我的要求(因为当时HTML与CSS的基础知识都学完了,想找一本进阶的书学习学习),于是就将它顺理成章地收入囊中了。其实,一般书的整体内容都差不多,粗看目录也看不出来区别,而且基本所有的书都大同小异,只需要根据自己的需求和喜好,花费几分钟的时间大致翻看、浏览一下就能发现这本书是不是你想要的了。
    大四第二学期开始,学院给我们组织安排了生产实习,虽然是在学校机房,但总的来说考虑的还算周到,总比没有强吧。其实,就是学院与其他单位进行了合作,在我们找工作之前,找一些人来带着我们做一些小项目,至少能给简历润色几分,不至于到时候简历上的项目经历一栏都是空白,(不过说实话,在这之前我还就真的没有任何web项目经历和经验,一直都在看视频,看书学习,从来没实战过,正想着借此机会练练手呢,谁知道居然讲的是Android项目,只好直接无视)。于是,在实习期间我就一直在看这本书,几乎没听过老师讲课,毕竟与自己的学习方向不符合,在这里浪费时间还不如利用这段时间自学,然后就用了两周的时间把这本书看完了,上面的案例也都自己手动敲了一遍(现在才感觉到:其实手动敲1遍真的太少,因为你会发现没过多久就把书上学到的技巧忘光了,所以复习很重要,当然,理解和记忆同样重要),觉得自己大致掌握了书本中的内容后,就开始出去找工作了。

    扯远了,扯远了,不扯了,现在回到正题。

    先看一下最终效果图:

    效果展示1

    我今天的学习内容如下:

    1.什么是DOM?
    2.DOM结构
    3.节点类型
    4.如何获取DOM元素;
    5.如何创建DOM元素;
    6.如何插入DOM元素;
    7.如何删除DOM元素;

    问题描述:

    在练习知识点7案例的过程中,基于案例本身想增加一个功能,在实现的过程中发现了这个问题。有想法但是没办法用代码写出来,测试了好多次都失败了,实在是没办法实现,只能去群里求助大神,最终找到了解决办法。

    现场还原

    功能说明:为了用原生JS实现动态插入和删除DOM元素。

    案例描述:页面中包含一个ul无序列表,一个input输入框和三个按钮。其中,ul元素包含3个li元素。

    方法实现:

    • 创建一个li元素节点和一个textNode文本节点,动态获取输入框的value值,赋值给textNode文本节点,然后将得到的textNode文本节点插入li元素当中,接着将组合好的li元素节点尾插在ul元素节点中,可分别实现尾插和头插。
    • 删除呢,就是,判断输入框的值是否和现有li元素的innerHTML值相等,有就删没有就不删,并且提示“删除失败!”。

    解释说明:

    • 尾插:appendChild( newnode )方法——在父元素内部的最后一个子元素的后面插入一个新元素
    • 头插:insertChild( newnode , exsitingnode )方法——在父元素内部已存在的任意一个子元素前面插入一个新元素
    • 其实,我称之为“任意子元素之前插入”,可以简称为“头插”。

    HTML代码如下:

    <ul id="list">
        <li>HTML</li>
        <li>CSS</li>
        <li>JavaScript</li>
    </ul>
    <input id="txt" type="text" placeholder="请输入要插入的内容">
    <input id="btn1" type="button" value="尾插"><!-- 上面的换行会被折算为一个空格并且在页面显示出来 -->
    <input id="btn2" type="button" value="头插">
    <input id="btn3" type="button" value="删除">

    静态页面如图所示:

    效果图

    JS代码如下:

    <script>
    //当页面加载完毕时调用
    window.onload = function(){
        document.title = "插入元素";
    
        /*功能1:尾插子元素*/
        var oBtn1 = document.getElementById("btn1");
        //给按钮添加(注册)点击事件
        oBtn1.onclick = function(){
            //首先,获取到下面要用到的相关元素
            var oUl = document.getElementById("list");
            var oTxt = document.getElementById("txt");
    
            //然后,必须新创建一个空的li元素,用于放置新增的内容
            var oLi1 = document.createElement("li");
            //接下来,得到输入框的值
            var value = oTxt.value;
            //然后,创建一个文本节点,文本内容设为输入框的值
            var textNode = document.createTextNode(value);
            //再将文本节点插入到li元素中,此时li元素已组装完成
            oLi1.appendChild(textNode);
            //最后将li元素插入到ul元素中
            oUl.appendChild(oLi1);
        }
    
        /*功能2:任意子元素之前插入,此处称为头插*/
        var oBtn2 = document.getElementById("btn2");
        oBtn2.onclick = function(){
            //先获取要用的元素
            var oUl = document.getElementById("list");
            var oTxt = document.getElementById("txt");
            var oLi = document.getElementsByTagName("li");
            //新建一个li元素
            var oLi2 = document.createElement("li");
            //新建一个文本节点,内容为输入框的值
            var textNode = document.createTextNode(oTxt.value);
            oLi2.appendChild(textNode);
            //最后将新建的li元素,插入到ul中的指定的一个子元素前面
            //注意:两个参数缺一不可!!!
            // oUl.insertBefore(oLi2,oLi[0]); 这两种方法等价
            oUl.insertBefore(oLi2,oUl.firstElementChild);
        }
    
        /*新掌握的知识:
        firstElementChild   首个子元素节点
        lastElementChild    最后的子元素节点
        */
    
        /*功能3:删除任意子元素*/
        var oBtn3 = document.getElementById("btn3");
        oBtn3.onclick = function(){
            var oUl = document.getElementById("list");
            var oTxt = document.getElementById("txt");
            var oLi = document.getElementsByTagName("li");
            var value = oTxt.value;
            //innerHTML用于获取标签之间的文本内容
            console.log(oLi[0].innerHTML);
            /*最初写的代码,无法实现*/
            for (var i = 0; i < oLi.length; i++) {
                if( oLi[i].innerHTML !== value){
                    alert("该元素不存在,删除失败!");
                    continue;
                }else{
                    oUl.removeChild(oLi[i]);
                }
            }
        }
    }
    </script>

    问题所在:

    /*
    alert在每次循环都会执行,我只想让它在最后一次循环结束后执行。
    换句话说,也就是在遍历完数组中的所有元素后,发现未找到该元素,
    此时alert一下,就是不知道这个alert语句应该写在哪个地方。
    */
    //简而言之就是,想让找不到的最后一次才弹出显示。

    之后实在找不到解决办法,就去群里请教了一番,这才知道原因在哪里——逻辑方面的问题
    因为要等所有的li元素都遍历之后,才能判断li元素中是否包含要插入的元素。
    我们不希望看到执行一次循环alert()语句就被触发一次,这显然不行,所以alert()语句就不能在for循环中写。
    但是,如果写在循环中,每循环一次都会执行到该语句,所以这个逻辑还有点欠缺。总感觉缺点什么东西,就是不知道到底缺什么。

    其实,欠缺的是如何判断这个情况到底有没有发生。
    问:哪种情况呢?
    答:即【遍历过所有的li元素后,它的innerHTML值都与文本框的value值不相等】 这一情况

    问:通过哪种方式去判断呢?
    答:在条件判断(就是if…else…)语句中加上一个标识(或称为开关,信号灯,旗帜)就行了。

    比如说,在最开始定义一个标识,这么来说吧,用我们身边的事情举例,通俗易懂。
    红绿灯大家都知道吧,红灯停绿灯行,这个规则也是提前制定好的,不能改变。在一开始,马路上就安置了一个红绿灯(即信号灯),而且规定红灯代表警告,禁止通行,绿灯代表允许,可以通行。

    问:那么,放置红绿灯(即信号灯)的目的是什么呢?
    答:目的就是为了当预定的事件来临时(这里指行人到达路口这一情况),所有人都能根据信号灯的颜色来判断当前应该怎么做,是停止还是通行。

    现在就显而易见了,我们可以提前定义一个布尔(Boolean,逻辑)类型的变量,命名为flag,它的特性刚好就能代表那个信号灯,因为布尔类型的变量只有两个取值,false和true,可以分别表示红灯和绿灯。当然也可以定义为0和1,0可以表示alse,1可以表示true。

    它应该不陌生吧,平时在好多的代码中都能遇见它。至少我见过好多次,但一直都不知道flag到底是干嘛用的,自然就想不起来用它。也有可能好多人都不知道该怎么使用,那么现在就让我们一起来好好认识一下这个所谓神奇的flag吧。

    问:什么是flag呢?

    答: 它的中文意思是“旗帜,或旗标”,FLAG是电脑程序中用于记录程序状态的一种标记,FLAG只有1(立起)和0(倒下)两个数值,它可以用来帮助程序做复杂条件的判断。但其实呢,flag是程序员自己定义的变量,作为一个标记(志),标记当前的进程,或者标记某种状态,用来控制程序的流向。只是因为在实际使用中方便好记才这么定义的。因为程序要实现的功能很多,为了区分各个程序段实现了什么功能就用标志位的值,然后使用if语句判断标志位的值,进入相应的程序实现相应的功能,当然flag的值由你来决定。

    上面介绍了这么多,我们只需要知道:
    flag是用来做标志的,程序运行的过程中flag会产生变化,flag=1就是给flag一个初始值1,然后在程序的运行过程中检测flag的值,如果它的值为1,则表示没有发生变化;如果flag的值为0,则表示发生变化了。最终就能以此来判断程序的执行情况。

    现在,让我们重新来分析问题:

    如果我们预期的不想看到的事件发生了,就手动赋值让flag=0;如果没有发生,就手动赋值让flag=1;刚好对应条件判断语句(就是if…else…)中的两种情况。现在我们也已经有了标识,最后呢,只要在for循环外面再用一次条件判断语句(就是if…else…),在语句内添加上flag产生不同的值时(即我们提前定义好的0和1或者true和false)所对应的不同处理方式,就能得到我们想要的效果了。

    别人的思路指示如下图所示:

    初始代码

    最终代码:

    /*核心代码*/
    
    //定义一个开关作为是否删除成功的标识
    var flag;
    for (var i = 0; i < oLi.length; i++) {
        if( oLi[i].innerHTML !== value){
            //flag值为0,表示删除失败
            flag = 0;
            continue;
        }else{
            oUl.removeChild(oLi[i]);
            //flag值为1,表示删除成功
            flag = 1;
        }
    }
    //根据flag的值判断是否删除成功
    if(flag == 1){
        alert("删除成功!");
    }else{
        alert("删除失败!");
    }

    最终效果图:

    效果展示1

    结束语

    学会灵活变通的在程序中应用好标志位可以使程序更灵活。

    展开全文
  • c语言flag(编程flag用法)

    万次阅读 多人点赞 2021-05-20 19:52:37
    c中一般设置一个变量flag,是一个来表示判断的变量,当做标志。例如当一直情况的时候,置flag为1,当另外一种情况时,置flag为2。 变量名为flag,只是习惯问题,也可.C语言中一般设置一个变量flag,是一个来表示判断...
  • 标记变量flag用法

    千次阅读 2021-01-29 03:54:40
    对标记变量flag用法不明白,请各位老师给讲解一下标记变量的用法,最好有实例;在下面的代码中,标记变量odd是怎么使用的?非常感谢!function stripeTables() {if (!document.getElementsByTagName) return false...
  • 简述标志位使用-51单片机为例

    千次阅读 2022-04-03 15:17:05
    通常在编写单片机代码的时候 ,会遇到一个开关量或者一个输出的引脚信息在多个或者特定的位置使用,就会导致很混乱,所以,衍生出一个叫做标志位的方式。增强代码的可读性。 标志位其实也可以叫做状态,其实就是...
  • python中flag 用法

    2022-05-10 23:03:04
    我问下这里为什么要加 flag=False和flag=True,有谁能帮忙解释下吗? def delete(): while True: student_id=input('请输入要删除学生的ID:') if student_id!='': if os.path.exists(filename): with open(filename,...
  • Python flag用法

    2022-09-03 19:21:55
    flag这一变量名常常被用于命名旗标变量,或哨兵变量。flag 作为一个标识,用来做数据的切换,这种变量的作用体现在帮助进行条件判断中,常常使用int类型变量中的0、1或布尔类型变量中的False(0)、True(1)来表示。
  • python中“标志位”的使用

    千次阅读 2020-11-20 21:10:53
    a=['a',1,2,3,4]b=['b',1,2,3,4]c=['c',1,2,3,4]d=['d',1,2,3,4]break_flag=0while break_flag==0:y_n=input('a,yes or no:')if y_n == 'no':breakelif y_n == 'yes':for i in a:print(i)while break_flag ==0:y_n_2...
  • 标志位作用及操作(转)

    千次阅读 2021-05-26 04:27:30
    使用标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。2、奇偶标志PF(Parity Flag)奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如...
  • 标志检查是否具有特定标志安装$ npm install has-flag用法// foo.jsimport hasFlag from 'has-flag' ;hasFlag ( 'unicorn' ) ;//=> truehasFlag ( '--unicorn' ) ;//=> truehasFlag ( 'f' ) ;//=> truehasFlag ( '...
  • flag寄存器是标志寄存器,其他寄存器是用来存放数据的,但是flag寄存器每一都有自己的含义。 上述的空位没有任何意义。 ZF 0标志位: 当运算结果为0,zf==1 当运算结果不为0,zf==0 PF 奇偶标志位: 当所有二进制...
  • python flag什么意思

    万次阅读 2020-11-23 23:58:49
    展开全部python中flag一般2113就是标记、标识的意思。比如:5261#!/usr/bin/python# -*- coding: UTF-8 -*-x = 7i = 1flag = 0while i
  • 当你使用串口发送数据时是否出现这样的情况: 1.发送时第一个字节丢失。 2.发送时出现莫名的字节丢失。 3.各种情况字节丢失。 没错,我都遇到过,哈哈哈, 1.先了解一下串口发送的流程图(手动描绘,): 可以假象...
  • )的用法(javascript 运算),也整理了一些常用的运算操作(常用运算整理),本文我们继续深入运算,来了解下二进制的经典应用-标志位与掩码。运算经常被用来创建、处理以及读取标志位序列——一种类似二进制...
  • 前端时间遇到正常使用的串口一直卡死在USART_FLAG_ORE标志位处,有一定概率发生这个,但在发生后,就会一直进入中断。按照网上的方法做了清除标志位处理,但结果还是解决不了。下面是之前写的代码连接,...
  • TCP Flag标志位(控制) 一个TCP包的详细内容: TCP FLAG 标记占1.5个byte,12bit(4bit+8bit,前半个byte与Header Length公用)。 12bit中前三个bit是保留,默认为全0: 000. .... .... = Reserved: ...
  • 使用Structopt轻松向命令行界面添加--port标志用法 示例:基础 在src/main.rs使用以下代码: extern crate clap_port_flag; #[macro_use] extern crate structopt; use structopt :: StructOpt; use clap_port_...
  • python语言标志位使用

    千次阅读 2019-10-20 17:46:29
    python语言标志位使用 问题描述: 共有两层循环,当第二层循环跳出循环时,第一层循环才跳出。 exit_flag = False #事先定义 for i in range(10): if i < 5: continue #结束本次循环,继续下次循环 print(i) ...
  • Android flag详解

    千次阅读 2019-11-01 10:29:05
    一.Flag标志位 在阅读源码的时候经常发现有一些标志属性使用一些操作来判断是否具有该标志,增加标志或者去除标志。 如: 为什么要使用16进制呢?为何不使用十进制0,1,2...?原因是因为这样就可以方便的用...
  • flag是什么意思-c语言flag用法

    千次阅读 2021-07-16 06:26:46
    flag是什么意思-c语言flag用法FLAG原本是一个编程指令,常被运用于计算机语言,例如C语言或D语言中,常于用来记载变量的一个参数。后指在游戏或影视出现剧情分歧时做出的影响后续剧情发展的选择,源自于编程术语,...
  • 表情符号标志一个简单的gem,用于获取或语言环境ID字符串(LCID)的。用法EmojiFlag . new ( 'nl' ) # => :Netherlands:EmojiFlag . new ( 'en' ) # => :United_Kingdom:EmojiFlag . new ( 'nl_BE' ) # => :Belgium:...
  • 使用 ActiveRecord 在单个整数列中存储多达 64 个多个标志()。 从 UI 的角度来看,它可以用作多选复选框存储。 在单个列中存储多个布尔值(例如首选项、通知设置、成就状态、配置文件选项等)的完美解决方案。 ...
  • 共回答了26个问题采纳率:84.6%flag是程序员自己起的变量名,一般情况下将其看作为标志位.我们通常将它视为uchar型变量,将flag赋值时,有flag=!1(flag不等于1)和flag=1;它的作用主要是让单片机的一项功能实现不同的...
  • c语言中标志位使用

    千次阅读 2020-09-15 23:31:14
    1、标志位可以在函数内部使用: void CTEST::CTEST() { m_flag = false; openDB(); } void CTEST::closeDB() { if(m_flag) //do sth. } void CTEST::openDB() { //do sth. if(不成功) { m_flag = ...
  • 二进制状态标志位在Java中的应用

    千次阅读 2019-11-15 16:57:36
    但是如果使用 二进制状态标志位 ,不管有多少状态,我只需要保存一个 int 类型的 mFlag 数据就完事了,因为这个 int 类型的数据中包含了我所有的状态信息,这足够能看出二进制标志位的威力了吧!其实Google的Android...
  • 正文大家好,我是bug菌~在嵌入式开发中难免会涉及到非常多的标志位处理,特别是玩单片机、裸机开发的朋友,比如跟一些模块配合联调会遇到各种信号是否到位、成功等等状态,而这些信号大多都是boo...
  • unicode标志查找器 一个TypeScript / JavaScript库,用于根据国家/地区名称或代码查找标记的Unicode 用法 呼唤 flag = Flags.find(country) 国家可以是完整的国家名称,也可以是国家的两个字母代码。 例如 flag = ...
  • py标志 类型安全(标志 笔记 Python 3.6+用户应该考虑使用标准enum模块的Flag和IntFlag类。 这些非常类似于此flags.Flags类。...使用此模块,您可以定义类型安全(标志标志定义的样式与您可以使用python

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 102,695
精华内容 41,078
关键字:

标志位flag用法