精华内容
下载资源
问答
  • 同样是同学遇到的面试题,面试官问的原题是如何用移位和加减实现除以3的操作,在此略微扩充一下,实现无符号整数除法,但是返回值也为无符号整型。   方法一:类似小学学习的除法运算,从高位开始减去除数,此处...

    同样是同学遇到的面试题,面试官问的原题是如何用移位和加减实现除以3的操作,在此略微扩充一下,实现无符号整数除法,但是返回值也为无符号整型。

     

    方法一:类似小学学习的除法运算,从高位开始减去除数,此处用除数左移到跟被除数对齐,在相减之前商也同样需要左移,代码如下。

    #include <iostream>
    
    using namespace std;
    
    unsigned int divide(unsigned int a, unsigned int b)
    {
    	if(0 == b)
    		__asm int 0
    	unsigned int c = 1, d = 0, _b = b;
    	while(a >= b)
    	{
    		c <<= 1;
    		b <<= 1;
    	}
    	b >>= 1;
    	c >>= 1;
    	while(b >= _b)
    	{
    		if(a >= b)
    		{
    			a -= b;
    			d += c;
    		}
    		b >>= 1;
    		c >>= 1;
    	}
    	return d;
    }
    
    int main()
    {
    	unsigned int in, out;
    	cin>>in;
    	cin>>out;
    	cout<<divide(in, out)<<endl;
    	return 0;
    }


    方法二:用被除数减去除数,每减成功一次商的结果加1,其它代码不变,divide函数代码改为如下。

    unsigned int divide(unsigned int a, unsigned int b)
    {
    	if(0 == b)
    		__asm int 0
    	unsigned int c = 0;
    	while(a >= b)
    	{
    		a -= b;
    		c++;
    	}
    	return c;
    }


    方法三:利用魔数。代码如下。

    #include <iostream>
    
    using namespace std;
    
    int divide3(int a)
    {
    	return ((__int64)a * 0xAAAAAAAB) >>33;
    }
    
    int main()
    {
    	int in;
    	cin>>in;
    	cout<<divide3(in)<<endl;
    	return 0;
    }


    其中方法三中的魔数的原理是为了用乘法实现32位被除数的除法运算,编译器会为被除数乘上一个32位的倒数,就形成了一个64位的数,其中低32位是余数,高32位为我们需要的结果,以下是一些常用的魔数,例如0xAAAAAAAB就代表2/3,0xCCCCCCCD代表4/5等等,具体可以在网上搜索相关内容。利用魔数除以5的代码如下。

    #include <iostream>
    
    using namespace std;
    
    int divide5(int a)
    {
    	return ((__int64)a * 0xCCCCCCCD) >>34;
    }
    
    int main()
    {
    	int in;
    	cin>>in;
    	cout<<divide5(in)<<endl;
    	return 0;
    }
    展开全文
  • 我们其实可以采取双符号位,最高位代表正在符号位,但是我们可以看到,如果采取双符号位的话,由于是绝对值参与的运算,最高符号位一定是0,所以就没有必要,如果我们硬要采取双符号位也未尝不可,只是我们选择算术...

    1.原码一位乘

    原码一位乘部分积采取一位符号位,逻辑左移

    在这里插入图片描述
    我们其实可以采取双符号位,最高位代表正在符号位,但是我们可以看到,如果采取双符号位的话,由于是绝对值参与的运算,最高符号位一定是0,所以就没有必要,如果我们硬要采取双符号位也未尝不可,只是我们选择算术右移。最高位代表真正符号位,次高位参与移位。我们还要了解到

    有多位符号位时,最高位代表正真符号位,不参与算术移位,其余符号位参与算术移位

    2.原码两位乘

    原码两位乘部分积采用三位符号位,算术移位

    在这里插入图片描述

    博主其实不是很理解为啥非要采用三位符号,两位符号位加不就OK了吗,今天终于给老子看懂了,真是不得不佩服膜拜前辈们的聪明才智(估计以后会让我五体投地)

    按照原码一位乘的想法,其实两位符号位正好可以满足部分积相加,再配合逻辑移位。但是这中间有错误,当我们加上负x的补码,这时候就会出现小于0的情况,但是逻辑移位后的值是一个大于0的结果,很明显和结果不符合,所以才有三位符号位,加算术右移就很好的解决了这个问题

    3.补码一位乘与补码两位乘

    补码一位乘部分积符号位采用双符号位,算术右移
    补码两位乘采用三位符号位,算术右移

    一位和两位乘原理差不多,这里就只介绍补码一位乘

    在这里插入图片描述

    其实理由很简单如果部分积采用单符号位,那么采用逻辑右移会和出现和原码两位乘同样的结果,所以采用双符号位算术右移

    4.原码除法

    原码除法余数与商符号位取一位,逻辑左移

    在这里插入图片描述

    此处由于是左移,我们知道补码的左移和原码一样,所以即使出现余数为负数的情况也不会出现错误。当然我们也可以取双符号位,算术左移

    5.补码除法

    补码除法符号位自然形成,余数与商符号位取一位,逻辑左移

    在这里插入图片描述

    展开全文
  • 定点除法运算

    千次阅读 2019-11-05 19:53:33
    计算机中,除法运算和乘法运算一样,是非常常用的一种运算。同样,除法运算在计算机中的实现也分为符号部分和数值部分两部分。...设被除数和除数分别为X和Y,Xf和Yf分别代表X和Y的符号位,除法运算结果为Z,Zf代...

    计算机中,除法运算和乘法运算一样,是非常常用的一种运算。同样,除法运算在计算机中的实现也分为符号部分和数值部分两部分。

    (1)符号位。符号位的确定和乘法运算的规则一致,除法运算的符号位无法通过转换补码,加入到除法运算中,必须单独进行处理。根据除法运算的规则:被除数和除数之间,符号位相同则为正,符号位不同则为负。设被除数和除数分别为X和Y,Xf和Yf分别代表X和Y的符号位,除法运算结果为Z,Zf代表Z的符号位。如下表所示。

    除法运算符号位结果真值表
    Xf Yf Zf
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    根据真值表,可得除法运算符号位的逻辑表达式为:

    Zf=Xf异或Yf

    (2)恢复余数法实现数值部分除法。数值部分除法在计算机中的实现也是从除法运算的笔算演变过来的。我们不考虑符号位,以两个正数的除法为例,做出一个除法运算笔算例子的完整过程。

    【例】设二进制小数X=0.1001,Y=0.1101,计算X/Y

    X/Y的竖式如下:

                                         0.  1  0  1  1

    0.1101          /  __________________

                        0.  1  0  0  1  0

                        0.  0  1  1  0  1

    —————————————————

                        0.  0  0  1  0  1  0  0

                        0.  0  0  0  1  1  0  1

    —————————————————

                        0.  0  0  0  0  1  1  1  0

                        0.  0  0  0  0  1  1  0  1

    —————————————————

                        0.  0  0  0  0  0  0  0  1

    结果为:X/Y的商为0.1011,余数为0.00000001

    计算机中的定点数的除法运算,商的位数一般与被除数和除数的位数相等。观察运算过程发现,除法运算笔算每次都上商,都是通过心算比较余数和除数的大小关系,如果余数大于除数,上1,然后做减法得出新的余数,新的余数低位补0;如果余数小于除数,则上0,余数低位补0得出新的余数。

    所以,除法运算的笔算每次上商是1还是0,关键是看余数和除数之间的大小关系比较。笔算中我们都是通过心算进行大小比较,但是,机器没有所谓“心算”,只能在余数和除数之间做减法操作,查看结果正负来判断大小关系。如果余数减去除数的结果为正,说明应该上商为1,而将减法的结果低位补0,就得到新的余数;而如果余数减去除数的结果为负,说明应该上商0,减法的结果无意义,恢复余数法的做法是,将减法结果加上除数,还原减法操作前的余数,然后再将余数低位补0,得到新的余数。

    从上面除法运算笔算 例子的竖式中可以看出,余数和除数之间的减法操作,在计算机中实际上使用的是加法器,将减法转换为补码加运算的方法实现的。设余数为A,除数为B,则:

    [A-B]补=[A+(-B)]补=[A]补+[-B]补

    观察笔算除法竖式发现,每次上商后,除数都需要右移一位来与新的余数对齐,机器字长为5的除法运算需要加法器的位数至少为9,。计算机中,我们可以对笔算算法稍作改变,除数右移一位的操作可以用余数左移一位来代替。这样就不需要在余数和新除数前加连续的0.但左移后的余数已经不是真正的余数,只有再将余数重新右移才能得到真正的余数。

    笔算求商时,商的结果是从高位到低位逐位算出来的。在计算机的实现中,计算出每一位的商以后,并不是直接把结果写到寄存器相应的位中,而是从高位开始,将每一位的商写到寄存器的最低位,然后左移一位,等待下一位商写到寄存器的最低位,再左移,再求下一位商……如此循环直到最低位写到寄存器中。

    此外,定点小数的除法,如果被除数的绝对值大于或等于除数的绝对值,那么很明显,除法结果的绝对值会大于或等于1,即商成为一个非纯小数。无法再用定点小数表示。并且,除法运算应该避免被除数和除数为0.所以,设被除数为X,除数为Y,X*和Y*分别为X和Y的绝对值。定点小数的除法必须满足下面的条件:

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

    【例】设二进制纯小数X=-0.1001,Y=0.1101,请使用恢复余数法,计算并列出执行X/Y的操作过程。

    求X和Y的原码,得

    [X]原=1.1001,[Y]原=0.1101

    首先判断符号位:

    Zf=Xf异或Yf=1异或0=1

    求x和y的绝对值,得

    X*=0.1001,Y*=0.1101

    求X*和Y*的原码,得

    [X*]原=0.1001,[Y*]原=0.1101

    求X*、Y*和-Y*的补码,得

    [X*]补=0.1001,[Y*]补=0.1101,[-Y*]补=1.0011

    余数恢复法执行过程如下:

    ①余数R=X*.商为0.0000.

    ②[R]补=[R-Y*]补=[R]补+[-Y*]补=0.1001+1.0011=1.1100,结果为负数。

    ③商的末尾置0,为0.0000,左移一位,还是0.0000;余数还原:[R]补+[Y*]补=1.1100+0.1101=0.1001;余数左移一位,末位补0,得[R]补=1.0010.

    ④[R]补=[R-Y*]补=[R]补+[-Y*]补=1.0010+1.0011=0.0101,结果为正数。

    ⑤商的末位置1,为0.0001,左移一位,得商为0.0010;余数左移一位,末位补零,得[R]补=0.1010

    ⑥[R]补=[R-Y*]补=[R]补+[-Y*]补=0.1010+1.0011=1.1101,结果为负数。

    ⑦商的末尾置0,为0.0010,左移一位,得商为0.0100;余数还原:[R]补=[R]补+[Y*]补=1.1101+0.1101=0.1010;余数左移一位,末位补零,得[R]补=1.0100

    ⑧[R]补=[R-Y*]补=[R]补+[-Y*]补=1.0100+1.0011=0.0111,结果为正数。

    ⑨商的末尾置1,为0.0101,左移一位,得商为0.1010;余数左移一位,末尾补零,得[R]补=0.1110

    ⑩[R]补=[R-Y*]补=[R]补+[-Y*]补=0.1110+1.0011=0.0001,结果为正数。

    ①①商的末位置1,为0.1011.

    数值运算结果和符号结果结合,得[X/Y]原=1.1011

    总结:首先根据计算位数设商为0.0000(本题的小数点后的精度为4,超出的均为溢出丢弃),然后根据[R]补=[R-Y*]补=[R]补+[-Y*]补的运算结果正负,来确定商的末尾置0还是置1(负数置0,正数置1),并且在每次计算后,计算结果都要左移一位,末尾补零,得到新的余数,然后再用这个新的余数进行计算(同样的公式)。记得这一点差别,商的末位无论置0还是置1,也需要左移,但是在下一步进行置0或是置1是在未移动的结果上进行置0或置1(不能用移动后的商)。同时,如果余数计算的结果为负,那就要恢复余数,也就是用余数再加上除数,然后再进行下面的操作。对于循环几次,取决于除数的位数,本题中除数小数点位数为四位,所以要移动四次,得到最后的结果便是结果(这时无符号位),最后我们再加上一开始判断的符号位便是最终结果。

    (3)加减交替法实现数值部分除法。加减交替法也称不恢复余数法,是对恢复余数法的一种改进算法。恢复算法每次用余数减去除数,都是为了观察余数和除数的大小关系,如果减法结果为负数,说明余数小于除数,那么就必须将结果再加除数来还原余数。反复的加减操作很大程度上影响了恢复余数法的运算效率。

    再次分析原码恢复余数法发现,余数减去除数,设结果为r:

    如果R>0,上商1,R 左移一位,低位补0,就得到新的余数。下一步新的余数再减除数,确定下一位商的结果。也就是说,如果R>0,确定下一位的商和r值的运算为:

    R=2R-Y*

    如果R<0,上商0,然后需要恢复余数,即R+Y*,将R+Y*的结果再左移一位,低位补0,就得到新的余数。下一步新的余数再减去除数,确定下一位商的结果。也就是说,如果R<0,确定了下一位商和R值的运算为:

    R=2(R+Y*)-Y*                即R=2R+Y*

    如此一来,当每次余数减除数的结果R为正或者负时,我们只需要根据正负上商,并按照不同公式计算新R的值来确定下一位商即可。不需要在进行当R为负数时恢复余数这样繁琐的操作了。

    【例】设二进制纯小数X=-0.1001,Y=0.1101,请使用加减交替法,计算并列出执行X/Y的操作过程。

    求X和Y的原码,得

    [X]原=1.1001,[Y]原=0.1101

    首先判断符号位:

    Zf=Xf异或Yf=1异或0=1

    求X和Y的绝对值,得X*=0.1001,Y*=0.1101

    求X*和Y*的原码,得

    [X*]原=0.1001,[Y*]原=0.1101

    求X*、Y*、-Y*的补码,得

    [X*]补=0.1001,[Y*]补=0.1101,[-Y*]补=1.0011

    加减交替法的执行过程如下:

    ①设余数R=X*=0.1001,商为0.0000.

    ②[R]补=[R-Y*]补=[R]补+[-Y*]补=0.1001+1.0011=1.1100,结果为负数。

    ③商的末位置0,为0.0000,左移一位,还是0.0000

    ④[R]补=[2R+Y*]补=2[R]补+[Y*]补=1.1000+0.1101=0.0101,结果为正数。

    ⑤商的末位置1,为0.0001,左移一位,得商为0.0010。

    ⑥[R]补=[2R-Y*]补=2[R]补+[-Y*]补=0.1010+1.0011=1.1101,结果为负数。

    ⑦商的末位置0,为0.0010,左移一位,得商为0.0100.

    ⑧[R]补=[2R+Y*]补=[2R]补+[Y*]补=1.1010+0.1101=0.0111,结果为正数。

    ⑨商的末位置1,为0.101,左移一位,得商为0.1010.

    ⑩[R]补=[2R-Y*]补=[2R]补+[-Y*]补=0.1110+1.0011=0.0001,结果为正数。

    ①①商的末位置1,得商为0.1011

    数值运算结果和符号结果结合,得[X/Y]原=1.1011

    总结:加减交替法采用了公式计算,前面和不恢复余数法一样,计算符号位,设余数为被除数,商为0,[R]补=[R-Y*]补=[R]补+[-Y*]补计算,而下面需要根据结果的正负来使用公式,如果结果为负数,则用R=2R+Y*计算出余数,然后再进行判断。如果结果为正数,则用R=2R-Y*计算,然后判断正负。循环的次数和不恢复余数法一样,由除数决定。最后循环结束再结合符号位就是最终的结果。

    浮点数的加减运算

    浮点数与定点数相比,所表示的范围更宽,有效精度更高,更加适合于科学计算。但浮点数的格式比定点数要复杂,硬件电路更复杂,实现的成本更高。一些微处理器自身不带有浮点运算功能,但另外配有协处理器,专门用于浮点数的四则运算。

    我们在前面讨论了浮点数在机器中的表示方法。阶码E采用补码或移码的方式表示;尾数F采用原码或补码方式表示。设有两浮点数X和Y进行加减运算时,必须按以下几步执行。

    1.对阶

    使X和Y的小数点位置对齐。才可以进行加减操作。

    由于阶码不同,X和Y的尾数的对应位所代表的权值是不同的。加减操作前,必须将X和Y的小数点位置对齐,也就是使X和Y的价码相等。对阶的原则是阶码小的数进行调整,打破浮点数规格化的要求,使两个数的价码相等。例如:

    设二进制浮点数X=101.1和Y=1.011,如果要执行X+Y。首先看X和Y在计算机中用N=2^E*F的形式表示,使用规格化形式,为:

    X=2^3  *  0.101100

    Y=2^1  *  0.101100

    X和Y的价码分别为3和1,尾数不能直接相加。按照阶码小的数向阶码大的数对齐原则,调整后的Y的表示为:

    Y=2^3  *  0.001011

    2.尾数加减

    将对阶后的两尾数按定点加减运算规则进行操作,尾数的加减运算一般使用变形补码的加减运算方式来实现。

    继续上面的例子,X和Y对阶完成后,尾数就可以进行加运算:

    [0.101100]补`=00.101100

    [0.001011]补`=00.001011

    [0.101100+0.001011]补`=[0.101100]补+[0.001011]补`=00.101100+00.001011=00.110111

    3.规格化

    为增加有效数字的位数,提高运算精度,必须将求和(差)后的位数规格化。规格化又分为左规和右规两种:

    (1)左规。当尾数的变形补码加减运算结果出现00.0***或11.1*****时,说明加减操作无溢出,并且,最高数值位表明,尾数不符合规格化要求,需左规。左规时尾数左移一位,阶码减一,直到符合补码规格化表达式为止,即结果为00.1********或11.0****

    (2)右规。当尾数出现01.********或10.**********时,表示尾数的变形补码加减运算结果溢出。在这定点加减运算中是不允许的,但在浮点运算中这不算溢出,可通过右规处理后继续使用。右规时尾数右移一位,阶码加一。

    继续上面的例子,执行完尾数加减操作后,X+Y的结果为:

    Z=2^3*0.110111

    结果符合规格化要求,所以X+Y的结果即为上式。用实数方式表示为:X+Y=(110.111)2进制

    【例】两浮点数X=2^+010   *  0.110100,Y=2^+100  *  (-0.101010),求X+Y

    阶码取三位,尾数取6位(均不包括符号位),设阶码和尾数均采用补码表示方式,机器表示的形式分别为:

    [X]补=0010 0110100

    [Y]补=0100 1010110

    第一步,对阶:先求阶差(两阶码的补码相减),减去正数补码0100就是加负数补码1100,使用变形补码方式执行:

    00 010+11 100=11 110

    结果的真值为-2,即X的阶码比Y的阶码小2.[X]补的阶码增大成0100,尾数右移两位,即

    [X]补=0100 0001101

    第二步:尾数以变形补码的形式相加:

    00.001101+11.010110=11.100011

    相加结果为:0100 1100011

    第三步:规格化:

    最高有效位与符号位相同,需要左规,尾数左移一位,阶码减1,结果为:

    [X+Y]补=0011 1000110,即

    X+Y=2^+011  *  (-0.111010)             【补码的补码即为原码】

    4.舍入

    在对阶和右规的过程中,可能会将尾数的低位丢失,引起误差,影响了精度,为此可以用舍入法来提高尾数的精度。常用的舍入法有三种:截去法、“恒置1”法和“0舍1入”法。

    截去法最简单,不用考虑 右移操作导致丢失的数据,直接丢弃。

    “恒置1”法也不考虑右移操作导致被丢掉的数据,而是直接将右移操作后的末尾恒置"1".从统计学角度看,“恒置1”法的平均误差为0,与截去法相比,有更高的可能性使结果更加准确。

    “0舍1入”法类似于十进制运算中的“四舍五入”法,即在尾数右移时,如果被移去的数值的最高位为0,则直接舍去;如果被移去的数值最高位为1,则在新尾数的末位加1.这种方法可以保证最大误差是最低误差上的-1/2到1/2之间,正误差可以和负误差抵消。是比较理想的方法,但实现起来比较复杂。并且有可能使尾数又溢出,如果溢出则再做一次右规。

    【例】两浮点数X=2^+10  *  0.1101,Y=2^+01  *  0.1011,求X+Y,舍入用“0舍1入法”。

    阶码取三位,尾数取四位(均不包括符号位),设阶码和尾数均采用补码表示方式,机器表示的形式分别为:

    [X]补=0010 01101

    [Y]补=0001 01011

    第一步,对阶,我们换一种方式,通过观察,我们发现Y的阶码比X的阶码小1,所以把Y的阶码编程0010,需要尾数右移,即01011右移一位,为00101,题目要求用0舍1入法,我们舍去的为1,所以尾数要加1,所以最终的位数为00110.[Y]补=0010 00110

    第二步,尾数以变形补码形式相加

    00.1101+00.0110=01.0011

    第三步,规格化

    因位数符号位为01,需要右规(尾数右移一位,阶码加1),右移后的位数结果为:01001.根据“0舍1入”法可知,尾数被移去一位,该位为1,所以尾数右移一位后末位要加1,即01010,得

    [X+Y]补=0011 01010

    浮点数的乘法和除法运算

    按照数学运算公式,我们知道,两个浮点数相乘,乘积的阶码等于两个乘数的阶码之和,乘积的尾数等于两个乘数的尾数的相乘;两个浮点数相除,商的阶码等于被除数的阶码减去除数的阶码,商的尾数等于被除数的尾数除以除数的尾数。设浮点数X和Y分别为:

    X=2^EX  *  Fx

    Y=2^EX  *  Fy

    X  *  Y=2^(EX+EY)  *  (Fx  *  Fy)

    X  /  Y=2^(EX-EY)  *  (Fx/Fy)

    一般乘除法运算之前,首先会检测能否简化操作。比如,检测乘法(除法)是否有乘数(被除数)为0,如果有乘数(被除数)为0,那么乘积(商)必为0.

    从数学运算公式就可以看出,浮点数的乘法和除法主要包括两组定点运算,分别为定点整数的阶码加减和定点小数的尾数乘除运算。尤其是除法运算中的尾数除法运算,要注意被除数尾数的绝对值是否小于除数尾数的绝对值,以确保商的尾数为小数。如果不是,则需要调整阶码,将被除数尾数右移一位,价码加1,然后再执行除法运算。

    最后,乘除运算过程也要考虑规格化和舍入的问题,以及溢出问题,尤其是阶码加减运算比较产生溢出。

    展开全文
  • 题目:在51单片机里,有两个16位(每个16位数是由两个字节组成)无符号数相除,结果放在30H、31H。例如:由R0、R1组成被数,R2、R3组成除数,被数的数值为500,除数的数值为1300,即“500/1300=0.3846”。在计算...

    题目:在51单片机里,有两个16位(每个16位数是由两个字节组成)无符号数相除,结果放在30H、31H。
    例如:由R0、R1组成被除数,R2、R3组成除数,被除数的数值为500,除数的数值为1300,即“500/1300=0.3846”。
    在计算结果中,小数点后面最少要有3位数(最好是4位),由于是刚入门,最好能给个汇编程序例子,小妹万分感谢!
    悬赏分:20 - 解决时间:2010-7-21 01:19
    ;==================================
    最佳答案:
    关于带有小数的运算,最简单的方法是:把它们都变换成整数来进行。
    就是先把“R0、R1组成被除数”,乘以10000,即为:500*10000;
    再用它除以“R2、R3组成除数”,得到:3846,显示的时候,再加上小数点即可。
    四个字节除以三个字节的程序,在我的空间里面有。
    比较麻烦的方法是:先学习C语言,再......。
    -----------------------------
    问题补充:谢谢“做而论道”大哥!我试了一下,相乘的结果在65536以内是没有问题的,但500*10000结果已经超出65536,结果出错,再次请教您一下,如何计算出3846这个结果呢?谢谢!

    回答补充提问:
    500*10000,应该采用16位数乘以16位数、等于32位数(4个字节)的乘法程序。
    这样,乘积虽然超过了65536,但是不会超过4个字节,所以不会出错。
    除以“R2、R3组成除数”,可以采用“四个字节除以三个字节的程序”,正确得出3846,肯定是没有问题的。
    这样的问题,我做过多次,都是成功的。
    ;==================================
    回答者: 做而论道 - 十三级   2010-7-20 22:58
    提问者对于答案的评价:用“万分感激”都无法表达我对“做而论道”大哥的解答!在您的帮助下,问题解决啦!爱死你啦!再次感谢!
    原题网址:http://zhidao.baidu.com/question/168265184.html
    ************************************************************************
    下面是另外一个问题。
    ************************************************************************
    关于51单片机的数值计算问题
    帮忙编写程序计算这个式子:X/20.9 = U/100000000。
    其中“X”为未知数,“U”代表51单片机即时采集的二进制数据变量,“100000000”为二进制常数,“20.9”为十进制常数。
    要求计算结果为三位十进制数(两位整数,一位小数),程序采用51单片机汇编语言设计。谢谢!
    悬赏分:30 - 解决时间:2010-8-2 12:26
    ;==================================
    最佳答案:
    U,是多少位二进制数字?

    问题补充:U是八位二进制数。
    -------------------------
    U是八位二进制数,就简单了。程序如下:
        MOV  A, U
        MOV  B, #209
        MUL  AB       ;乘以209,可以方便以后的计算.
                      ;乘积为16位。再除以256(即100000000),右移8位即可.
                      ;商就是剩下在B中的8位数了.
        MOV  A, B
        MOV  B, #10
        DIV   AB       ;除以10,余数就是“一位小数”.
        MOV  R2, B    ;保存小数.
        MOV  B, #10
        DIV   AB       ;再除以10,余数就是“个位数”.
        MOV  R1, B    ;保存个位数.
        MOV  R0, A    ;保存十位数.

    ;完
    结果的“两位整数,一位小数”,分别存在 R0, R1, R2 中。
    ;==================================
    回答者: 做而论道 - 十四级   2010-8-2 10:41
    提问者对于答案的评价:非常感谢!多给你点分。
    原题网址:http://zhidao.baidu.com/question/171453425.html

    展开全文
  • 原码除法

    千次阅读 2020-09-19 17:21:04
    计算机原码除法主要分为恢复余数法和加减交替法,我们先从十进制除法运算中获取一些规律,再运用到二进制的除法运算中. 十进制除法 仔细观察下面十进制运算782/7的过程. 782除以7第一位商上1,余数为0.第二位上1,余数...
  • 下面两个代码的运行,你就会发现区别了。//结果为0.468 CGFloat tFloat = (CGFloat)375/800; //结果为0 ...//结果为+lnf 代表正无穷 CGFloat tFloat = (CGFloat)1/0;原因:两个整数相除,结果也为整数。
  • 补码的除法运算

    千次阅读 2020-09-23 20:47:03
    补码的除法运算是将两个数都使用补码的形式来进行计算,和原码的除法相比,补码的除法运算中被除数,除数以及余数都采用双符号位的形式参与计算,最后得到的余数符号位就代表着最终结果的符号位. 加减交替法 题目:假设...
  • python 除法运算中 / // % 各代表什么?

    千次阅读 2020-07-12 23:00:10
    一、代码测试 a = 3 b = 2 #整除 print(a // b) #点 print(a / b) #取余 print(a % b) 二、输出结果 1 1.5 1
  • 基于FPGA的除法器设计

    千次阅读 2019-07-15 16:50:52
    所以有必要来设计一款除法器,使其不占用那么多逻辑资源,并且所用时钟数能够满足约束要求。(减弱空间复杂度、增加时间复杂度,并且满足时间约束)。 计算机内部乘除法原理 众所周知,计算机所能完成的基本元操作...
  • 二进制乘除法的实现

    万次阅读 2017-09-25 11:49:20
    转自:...因为无论是减法还是乘法,都可以由加法运算来替代,唯有除法不能由加法替代。 了解计算机运算的规律,可以有助于我们理解很多程序代码上无法理解的内容。比如上章提到的溢
  • 除法、取余

    千次阅读 2013-05-21 09:05:15
    一、下面的题目你能全做对吗?  1.7/4=?  2.7/(-4)=?  3.7%4=?  4.7%(-4)=?...二、除法的取整分类  ...除法的取整分为三类:向上取整、向下取整、向零取整。  1.向上取整:向+∞方向取最接近
  • 除法和算术右移之间的巧妙取代

    千次阅读 2016-10-16 15:03:16
    在大多数机器上,整数 的除法很慢,需要30多个时钟周期,除以2的幂也可以用移位运算来实现 先码上代码  #include "stdio.h"  int main()  {  int x=-128;   int y=x/4;  printf("y=%d",y);  } 再附上汇编...
  • C/C++除法实现方式及负数取模详解

    千次阅读 2013-08-07 10:26:33
    [转]C/C++除法实现方式及负数取模详解 一、下面的题目你能全做对吗? 1.7/4=? 2.7/(-4)=? 3.7%4=? 4.7%(-4)=? 5.(-7)/4=? 6.(-7)%4=? 7.(-7)/(unsigned)4=? 答案: 1 -1 ...
  • 用移位实现除法操作

    千次阅读 2013-05-29 21:37:39
    用移位实现除法操作,基本思想是:把除数向左移位来逼近被除数#include "stdafx.h" #include using namespace std; bool g_inputvalid=true; /******************************* first:被除数 second:除数 ...
  •  不管是啥语言都离不开加减乘除这些算法,但是在Python里面你知道这些符号代表什么运算吗?  “/”这个是除法运算,那么这个“//”呢?“*”这个是乘法运算,那么这个“**”呢?下面来一一介绍下。 “//”...
  • Python 小技巧之除法运算、幂运算

    千次阅读 2012-12-03 22:37:49
    不管是啥语言都离不开加减乘除这些算法,但是在Python里面你知道这些符号代表什么运算吗?  “/”这个是除法运算,那么这个“//”呢?“*”这个是乘法运算,那么这个“**”呢?下面来一一介绍下。 “//”运算...
  • C/C++除法及取模

    千次阅读 2014-11-04 20:13:17
    除法的取整分为三类:向上取整、向下取整、向零取整。 1.向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,7/4=2,7/(-4)=-1,6/3=2,6/(-3)=-2 2.向下取整:向-∞方向取最接近精确值的整数。在这种取整...
  • Python的变量以及Python的除法

    千次阅读 2017-11-13 12:18:19
    这里主要介绍Python的三个除法符号,其作用各不相同 1、‘/’,精确除。>>>10/3 3333333333333.5 2、 ‘//’,地板除。>>>10//3 3 #取整数 3、 ‘%’,取余除、。>>>10%3 1 #取两个数相除的余数
  • 一、下面的题目你能全做对吗? 1.7/4=? 2.7/(-4)=? 3.7%4=? 4.7%(-4)=? 5.(-7)/4=? 6.(-7)%4=? 7.(-7)/(unsigned)4=?...二、除法的取整分类 ...除法的取整分为三类:向上取整、向下取整、向零取整。
  • 虽然我们在编程语言中可以直接使用+-/,但是对某些要求不能用/的情况下,我们有必要了解一下计算机是怎样完成乘除法的。 首先,我们要明确一下计算机所能完成的最基本操作是:+(-)和左移右移。虽然ISA中一般都有...
  • 文章目录除法("/") 运算取模("%")运算取整除("//")运算幂运算 除法("/") 运算 #除法运算 i = 20 j = 2 z = i / j print("z is {}".format(z)) print(type(z)) z is 10.0 <class ‘float’> 尽管 i,j 都是int...
  • Sympy符号计算库

    万次阅读 2014-09-07 22:19:52
    SymPy是Python的一个数学符号计算库。它目的在于成为一个富有特色的计算机代数系统。它保证自身的代码尽可能的简单,且易于理解,容易扩展。SymPy完全由Python写成,不需要额外的库。 Sympy安装 pip install sympy ...
  • C语言 —— 符号(C语言的基本符号

    万次阅读 多人点赞 2019-01-09 09:10:33
    C 语言的基本符号就有 20 多个,每个符号可能同时具有多重含义,而且这些符号之间 相互组合又使得 C 语言中的符号变得更加复杂起来。 符号 名称 符号 名称 , 逗号 &gt; 右尖括号 . ...
  • C语言符号

    千次阅读 2012-12-05 14:03:50
    C语言运算符的优先级 一、运算符的优先级表 C 语言的符号众多,由这些符号又组合成了各种各样的运算符。既然是运算符就一定有...也有人说不用记这些东西,只要记住乘除法的优先级比加减法高就行了,别的地方一律加上
  • 符号计算

    千次阅读 2016-08-10 14:12:48
    一、符号常数、符号数字Generally,speaking,在有限长数字计算机中,不能始终保持完全准确,但有时我们又需要完全准确,此时就出现了符号计算,为区别于一般数字的记录,MATLAB中采用符号数字。对此,有固定的格式: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 66,783
精华内容 26,713
关键字:

代表除法的符号