精华内容
下载资源
问答
  • 1,两个负数相与如何判断? 2,两个同号的数相加如何判断? 3,两个异号的数相加如何判断
  • 如何判断OF溢出标志位的值?

    千次阅读 2020-04-12 22:04:52
    在做运算实现函数功能的相关题目时,我遇到了一个很重要的问题,两个有符号整数做加/减法时,用来判断是否溢出的OF如何判断? 最后整理出3个方法,整理并分享出来,希望对您有帮助。 1.根据计算机组成原理课上...

    在做位运算实现函数功能的相关题目时,我遇到了一个很重要的问题,两个有符号整数做加/减法时,用来判断是否溢出的OF位该如何判断?

    最后整理出3个方法,整理并分享出来,希望对您有帮助。

    1.根据计算机组成原理课上学习的知识

    OF = Cn ⊕ Cn-1

    注意这里的Cn和Cn-1并不是指x+y或x-y结果补码的最高有效位的左边的进位以及最高有效位的数值,而是指x+y或x-y结果补码的最高有效位以及次高有效位的进位情况,若有进位,该值为1,否则为0。
    下面以8位机器数(首位为符号位)为例简单说明

        1 0 0 0 0 0 0 1
     +  1 0 0 0 0 0 0 0
     --------------------
      1 0 0 0 0 0 0 0 1
    

    两数相加的补码运算如上,[x]补 + [y]补 = [x + y]补
    在结果中,最高有效位进行的运算是1 + 1有进位,因此Cn = 1;次高有效位进行的运算是0 + 0没有进位,因此Cn-1 = 0。
    1 ⊕ 0 = 1,即OF = 1,发生溢出。

    OF = A7 ⊕ B7 ⊕ C7 ⊕ C8

    以8位数运算举例:
    8位二进制数A:A7 A6 A5 A4 A3 A2 A1 A0
    8位二进制数B:B7 B6 B5 B4 B3 B2 B1 B0
    A +/- B 的结果9位二进制数C:
    C8 C7 C6 C5 C4 C3 C2 C1 C0
    OF = A7 ⊕ B7 ⊕ C7 ⊕ C8
    这里的C8就是CF位(carry)。
    方法2参考来源:CPU是如何检测溢出的

    3.先思考一下问题的本质——什么时候发生溢出?
    在两个加数(因为做减法也是通过补码加法实现的)的符号位相同且与和的符号位不同的情况下才会发生溢出。说明两个正数相加得出负数,或者两个负数相加得出正数,这显然是不正确的。因此只要

    看 加数1,加数2,和 3个数的符号位即可。
    1 1 0 或者 0 0 1发生溢出,OF = 1。

    (可以看到上面举的例子就是1 1 0的情况)

    在你遇到这样的一个例子127 - (-128)可能会产生怀疑

        0 1 1 1 1 1 1 1
     +  1 0 0 0 0 0 0 0
     --------------------
        1 1 1 1 1 1 1 1
    

    在这个例子中根据上面的方法算出OF = 0,可是明明结果是一个很大的正数,超过了8位带符号机器数所能表示的范围,结果却是-1。
    其实并不是算OF的方法错了,做加法运算的这个步骤的确没有溢出。而是在第二个加数为了求其补码时,需要各位取反之后,末位加1,在求补码的时候取负运算发生了溢出。

    总结

    计算OF的方法的本质就是
    最高位运算的进位 ⊕ 次高位运算的进位
    由此延申出几种判断方法。
    个人认为方法3最容易判断,首推方法3。不过要特别注意第二个数是最小负数的情况。并且在位运算实现函数功能时方法3也是最容易实现的,因为方法1、2需要知道最高有效位的进位,需要知道前一位是否有进位,用前一位的进位,本位加数1的符号位,本位加数2的符号位相加是否与和的当前符号位相等判断最高有效位是否进位,这个很难处理。

    展开全文
  • 如何停止正在运行的ansytask,楼主试过用标志位判断,可是不管用
  • 485通讯数据帧结束判断标志位如何判断: 在485通讯中,如何去判断一帧数据接收结束呢? 首先要知道的是,在每帧数据中,每个字节之间的数据发送间隔时间一定会小于每帧数据的之间的发送间隔时间。也就是说对于接收...

    485通讯数据帧结束判断标志位如何判断:

    在485通讯中,如何去判断一帧数据接收结束呢?

    首先要知道的是,在每帧数据中,每个字节之间的数据发送间隔时间一定会小于每帧数据的之间的发送间隔时间。也就是说对于接收数据来说在字节之间每个数据帧之间的接收时间是不一样的,数据帧之间的接收时间要大于数据帧之中每个字节的接收时间的。那么就可以利用这两种数据的间隔时间的区别来进行区分是否一帧数据接收完毕。

    在485通讯的接收过程中,所以看起来是一帧一帧数据接收的,但是实际情况还是每个字节每个字节来进行接收的,那么如果添加一个定时器,来对每次接收字节的时间来进行计时,在发送数据帧的时间固定的情况下,就可以实现对每帧数据的字节发送间隔时间和每帧数据的接收间隔时间,而每帧数据的接收时间一定会远远大于每帧数据中的每个字节的接收时间的,甚至可以说一帧数据发送下来的时间一般都会远小于每帧数据的发送间隔时间。

    所以在实际应用中,每次接收到字节时,都对当前的计数值进行清零操作。那么只要还在接收数据,当前计数值都不会超过单个字节的接收时间,而当计数值达到一定值的时候,这个值要远远超过单次接收字节的时间的时候,就可以判断没有数据发送过来,进而认为当前数据接收完毕,此时可以设置接收标志位方便操作。

    下面分享主要函数。

    串口中断函数:

    void USART1_IRQHandler(void)
    {
    	u8 res;	    
    
     	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收到数据
    	{	 	 
    		res =USART_ReceiveData(USART1); 	//读取接收到的数据
    			RS485_RX_BUF[RS485_RX_CNT]=res;		//记录接收到的值
    			RS485_RX_CNT++;						//接收数据增加1 
    			timout=0;     //定时器计数值清零
    		if(RS485_RX_CNT==1)    //接收到的第一个数据时,开始计数
    			timrun=1;
    	}  											 
    }
    

    此时也可以看出计数器只有在接收到数据时才开始计数工作,这也避免了不关闭计数器导致计数器平常工作导致技术寄存器溢出而差生的误判操作。

    数据处理函数:

    void RS485_Receive_Data()
    {
    	u8 rxlen=RS485_RX_CNT;
        if(reflag==0)      //没有收到MODbus的数据包
        {
            return ;                //没有收到处理指令,继续等待下一条数据
        }
    	MOBUS_CRC=GetModbusCRC16(RS485_RX_BUF,rxlen-2);//计算的校验码
    	MOBUS_RCCRC=RS485_RX_BUF[rxlen-1]+RS485_RX_BUF[rxlen-2]*256;//收到的校验码
    	if(MOBUS_CRC==MOBUS_RCCRC)//接收到了数据,且接收完成了
    		{
    			if(RS485_RX_BUF[0]==0xAA)
    				{			
    					RS485_Send_Data(RS485_RX_BUF,rxlen);
    				}
    		}
    	  RS485_RX_CNT=0;		//清零
    	  reflag=0;
    
    }
    

    reflag标志位是接收数据标志位,当其置一时,代表着接收数据完毕,可以开始处理数据,如果未接收完毕,则会利用return跳出当前函数,不执行后续操作,等待下次判断。

    定时器计数函数:

    void TIM3_IRQHandler(void)   //TIM3中断
    {
    	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
    		
    
    	    if(timrun!=0)        //串口发送数据是否结束,结束就让定时器定时
    		  {
    	     timout++;           //定时器定时1毫秒,并开始记时
    			 if(timout>=8)       //间隔时间达到了时间,假设为8T,实际3.5T即可
    				{
    					timrun=0;        //关闭定时器--停止定时
    					reflag=1;        //收到一帧数据,开始处理数据
    				}
    			}
    			
    		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源 
    
    }
    

    当接收到第一个数据时,开始计数。当其计数值达到一定值时,便代表着数据接收完毕,关闭计数功能,将接收标志位置一。

    校验位计算函数:

    unsigned short GetModbusCRC16(unsigned char *cp,unsigned int leng)
    {
    	 unsigned int j,i,crc=0xFFFF;
    	 if (leng<=0) 
    		 {
    			return 0;
    		 }	
    	 for (j = 0; j < leng; j++) 
    		 {
    				crc = crc^(unsigned int)(cp[j]);
    				for(i = 0; i < 8; i++) 
    					{
    						if ((crc&1)!=0 ) 
    							{
    								crc=(crc>>1)^0xA001;
    							} 
    						else 
    							{
    								crc=crc>>1;
    							}
    					}
    	 }
    	 return (unsigned short )crc;
    }
    

    该函数是ModbusCRC16校验位的计算函数,可供大家参考。

    展开全文
  • 1.先不带标志位仿真,判断输入到输出需要几个时钟 然后如果立刻输出的话那就只能延长输出时间去空出一段时间给标志位电平变化的时间,通过寄存器在时序模块中不断使用非阻塞赋值来延时。在延时的这段时间标志位可以...

    在给标志信号命名时,标志位命名为...._sig表示,,比如shift_done_sig 表示。。。的标志位
    在程序中怎么写输出标志位

    两种方法:

    1.先不带标志位仿真,判断输入到输出需要几个时钟
       然后如果立刻输出的话那就只能延长输出时间去空出一段时间给标志位电平变化的时间,通过寄存器在时序模块中不断使用非阻塞赋值来延时。在延时的这段时间标志位可以赋值为低,最后输出数据的那个时钟赋值为高,这样就产生了标志位高低电平变换,可给后面的模块拿来判断前一个模块是否完成输出。

     

    2.还有一种方法 如果状态很多的话可以是使用状态机,在每一个状态中可以去定义标志位状态,比如在中值滤波中不断排序就可以使用状态机。

    转载于:https://www.cnblogs.com/danielwc/p/9074349.html

    展开全文
  • 如何判断状态标志位??OF和CF到底怎么计算???? 之前,一直被OF和CF这对神仙眷侣搞得云里雾里,总之三个字:看不懂!!! 不过不会也是要整滴~不然越拖越多,今天偶然发现其中的奥秘,不过也可能是以前看书不太...

    如何判断状态标志位??OF和CF到底怎么计算????

    之前,一直被OF和CF这对神仙眷侣搞得云里雾里,总之三个字:看不懂!!!

    不过不会也是要整滴~不然越拖越多,今天偶然发现其中的奥秘,不过也可能是以前看书不太仔细吧!哈哈!正文开始:

    先给出一个例题

    MOV AL , 7EH
    ADD AL , 5BH
    执行完这两条指令后,状态标志位的状态分别为??

    接下来,傻瓜式教学,仔细看一定会:
    7EH=0111 1110B
    5BH=0101 1011B
    两者相加得D9H=1101 1001B

    八位数加八位数得到一个八位数

    好的,我相信大家的实力,二进制是一定会计算的对吧!
    然后先判断其他的状态位:
    AF:D3位向D4位有进位吗? 我们计算的有,于是AF=1
    PF:低八位的所有位数中1的个数是偶数吗? 我们可以数一共有5个1,是奇数个,所以PF=0
    SF:最高位是1吗? 我们看到D9H的最高位是1,所以SF=1
    ZF:运算的结果等于0吗? 我们计算的D9H不等于0,所以ZF=0

    重头戏来了:

    CF:(简单方案)最高位向前有进位吗? 我们没有看到进位,所以CF=0

    但是:仅仅如此就是忽视了它最本质的意思,CF是无符号数进借位标志。
    这一句是什么意思呢?就是说计算的结果要和八位数中的最大值相比,看他有没有进位!怎么相比?八位数中的最大值是多少?FFH!!!D9H>FFH吗?不大于!所以结果没有超出标识范围,CF=0

    OF:有溢出吗?

    第一种方式:D9H作为有符号数为负!两个正数相加加成了负数,自然有溢出!所以OF=1
    第二种方式:D6位向D7位是否有进位,D7位向D8位是否有进位?同时进位或者同时不进位则OF=0;如果只有一个进位OF=1.如题:因为只有D6位向D7位进位,所以OF=1.
    第三种方式:OF是有符号数溢出标志!这是什么意思!看他有没有溢出呀,最大的有符号数是多少?7FH!D9H>7FH,所以OF=1.然后你说,不对啊,有符号数D9H=-59H,怎么就大于7FH了?我们将它这样理解:虽然有符号数的最大数为7FH,但是计算机并不能识别符号位,因此还是会将其看成无符号数,只是比较的时候比较这两个数,于是说D9H>7FH.

    综上所述:
    AF=1;CF=0;OF=1;PF=0;SF=1;ZF=0

    个人的一点理解,如果有不对的地方希望大神指正。

    展开全文
  • 可以直接查看/proc/cpuinfo文件,其中有关于CPU的详细信息,包括型号、CACHE、频率等等,但是没有地方明确的写明是32还是64的,不过在FLAG那一行有很多的标志信息,如果其中有LM标志,说明这个是64的CP...
  • CMP指令、标志位、JCC指令总结

    千次阅读 2020-02-01 20:57:48
    CMP指令、标志位、JCC指令总结 之前看到了cmp指令,总是记混。现在准备对CMP指令和汇编条件的判断做一个简单的总结。 CMP指令 cmp(compare)指令进行比较两个操作数的大小 例:cmp oprd1,oprd2 当执行到CMP指令...
  • 此种写法只能用于标志位判断是否和初始化值相同用!注意!地值为 1 ! 方法二 采用共用体的方法,用ID_Dat替代结构体bit的整体。bit结构体内成员相加为多少,ID_Dat就为多少! 本人菜鸡一名,有什么错误欢迎...
  • 如何判断一颗二叉树中的结点所在的深度 (设根节点的深度为1) 在一棵二叉链表表示的二叉树中,求结点的深度。 设这样的一颗二叉树,深度为4,假设就D这个结点所在的深度 首先判断他的根节点是否为空,若为空,...
  • 我需要在所有的子线程写入完毕后在文件末尾写“---END---”及关闭文件流等,这个时候我就需要某个标志位可以告诉我是否线程池中所有的子线程都已经执行完毕,我使用这种方式来判断。 ——————————————...
  • 琢磨了一下子这道题目,想要在汇编中实现选择,那就只能用条件转跳了,条件转跳 肯定就和标志位 息息相关,用啥子,标志位咧,ZF?CF?AF?SF?  我好难啊喵~,都试一遍吧 第一种: start: mov al, 1 ...
  • 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针) struct node { char val; node* next;}  bool check(const node* head) {} //return false : 无环;true: 有环一种O(n)的 办法...
  • 溢出OF和进位CF标志位的判定

    万次阅读 多人点赞 2017-03-10 10:28:40
    我们如何人为判断两个二进制字符串的CF,OF呢? 方法一:根据表达式OF=Cn异或Cn-1 Cn表示第n的进位 CF=Cout异或Cin Cin等价于Sub的选择控制,为1时表示做减法 加法时,CF为1表示有进位;减法时,CF取反为1...
  • 一、如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针) struct node { char val; node* next;} bool check(const node* head) {} //return false : 无环;true:有环 一种O(n)的办法...
  • 3、先遍历第一个链表,记住最后一个节点,再遍历第二个链表,得到最后一个节点时和第一个链表的最后一个节点做比较,如果相同,则相交如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针) ...
  • 判断两个链表是否相交:(假设两个链表都没有环) 1、判断第一个链表的每个节点是否在第二个链表中 ...如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针) 一种O(n)的办法就是(用两个指...
  • ,例如批量发送文件,发送开始的时间,最好设置一个标志位,一个文件发送结束的时间,改变这个标志位,接收方根据标志位,来决定是继续接收,还是接收完毕,开始接收下一个文件.-------------------------...
  • 判断两个链表是否相交:(假设两个链表都没有环) 1、判断第一个链表的每个节点是否在第二个链表中 2、把第二个链表连接到第一个后面,判断得到的...(注意不能用标志位,最多只能用两个额外指针) 一种O(n)的办法
  • CPU如何设置溢出标志OF

    千次阅读 2008-10-22 16:08:00
    例如 MOV AL, 0FFh ADD AL, 1 其结果产生进位,但... 二我们知道,CPU在进行计算时是没有有符号数于无符号数的区别的,那么它如何判断一个运算超过了其表数范围呢? 答案是: 它将目的操作数在运算过程中的最高2的进
  • 用sharedPreferences保存一个标志位,第一次运行后就把boolean置为false,以后通过读出boolean值来判断,若为false,就知道不是第一次运行。 转载于:...
  • 1、通过点击事件发生后,改变标志位的值,记录点击状态 1 function(){ 2 var isClick = false; 3 $('#test').click(function(){isClick = true;}); 4 $('#show').click(function(){alert(isClick);}) 5 } 2、增删...
  • 如何在不使用标志位的情况下初始化这个结构体里的成员变量 dataBuffer[f].pos = pos; dataBuffer[f].velocity = float3(0, 0, 0); (补充说明:如果没有这个if分支初始化变量会导致不显示,直接初始化没有标志位...
  • 设立一个标志位,比如说是flag 最开始时队列为空,设flag=0 当入队的时候让flag=1 出队的时候flag=0 然后再加上判断队头队尾指针是否重合 重合,且flag=0,则为空 重合且flag=1,则为满

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 245
精华内容 98
关键字:

标志位如何判断