单片机 怎么用位移的方法实现乘除法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单片机 怎么用位移的方法实现乘除法相关的知识,希望对你有一定的参考价值。

我想问的是多字节的二进制乘除法 怎么用位移的方式实现乘除

因为在寄存器里的数都是二进制的,所以乘以2:左移一位;乘以4左移两位;乘以8左移三位……依此类推(但要注意寄存器总共有多少位,防止溢出),除法用右移。
直接移位只能计算乘数(或除数)为2的n次方的乘(除)运算,对于一般的乘除法,还要配合加(减)法运算,比如a?9=a??3+a
实际上二进制数的基本运算即加,取反,移位等,通过变换来计算减,乘,除。
可以验证,用单片机C语言编程计算乘数为2的n次方的乘法运算比乘数为一般数的乘法运算要快得多,就是因为前者只需直接移位,后者还需配合加法或经多步运算
参考技术A 比如0001,左移一位则是*2,左移两位则是*4,以此类推。
同理,右移就是除法。
比如00000011,实际是3,你左移一位,即00000110,结果为六。
参考技术B 现在很多单片机有乘法电路。如果没有乘法电路,那么用循环的加法或者减法。 参考技术C 找一个汇编的乘法库,研究下

仅使用位移加法和减法的对数时间整数除法

【中文标题】仅使用位移加法和减法的对数时间整数除法【英文标题】:Logarithmic time integer division using bit shift addition and subtraction only 【发布时间】:2017-09-20 15:34:36 【问题描述】:

我被要求仅使用位移、加法和减法来实现具有对数时间复杂度的整数除法。

我可以看到如何处理 2 的幂的除数,但如何处理奇数除数,以使时间保持对数?

有可能吗?

编辑:一种在非对数但仍优于线性的时间复杂度内的方法也将受到欢迎。

谢谢

【问题讨论】:

据我所知,一般情况下不可能。除法最多可以像乘法一样有效,即 O(M(n)) 的时间复杂度,而基于 Schönhage-Strassen 的乘法的复杂度为 O(n log n log log n)。常数很大,所以这种方法通常只对数千位的操作数有意义。你的问题是理论上的吗?如果是这样,我建议在Computer Science Stackexchange 上提问。如果你有一个实际的应用程序(用例),你的操作数有多大? 嗨,这是一个装配练习。我认为下面建议的方式有对数时间。 以下答案中概述的方法的时间复杂度为 O(n)。 这取决于你选择的 n - 如果 n 是被除数,它是对数的(例如,40 亿需要 32 次移位),如果 n 是被除数中的位数,它是线性的,但是您已经记录了股息的日志以获取位数。 @Tony Lee 这不是传统的算术函数复杂性衡量方式。 【参考方案1】:

这就像在纸上做长除法,但是是二进制的。您将除数中的位移入累加器,直到它至少与除数一样大,然后从累加器中减去除数并继续,直到您一直处理所有位,同时为每个移位记录一个 0,不带减法和每次减去 1。

15/5 (1111/101)
dividend accumulator result
1111      0000       0  - can't subtract, shift
1110      0001       0  - can't subtract, shift
1100      0011       0  - can't subtract, shift
1000      0111       0  - can subtract, set 1
1000      0010       1  - can't subtract, shift
0000      0101       10 - can subtract, set 1
0000      0000       11 - we're done since we shifted 4 times

答案是 3 (11)。

被除数的最高位移动到累加器的底部。 每次移动被除数/累加器时,结果都会移动。

被除数的值是时间的对数,而不是被除数的位数。

【讨论】:

太棒了。我设法在汇编中实现了它,它似乎有效。谢谢!【参考方案2】:

我不知道为什么答案是“不可能的”。也许我不明白这个问题。理论上它是可能的,但是在支持并行计算的硬件上。在“普通”计算机中,创建和管理线程的成本很高。 假设我们有除法:

a/b = x

我们希望仅使用位移、加法和减法以对数时间计算 x。 所以我们正在寻找满足这一点的 x:

a = bx

可以通过二分查找找到它。 在二分查找的每一步中,我们必须进行一次乘法和一次比较。 乘法可以在对数时间内完成,因为我们可以做多项式的和。可以使用多项式线程数。 通过实现加法器电路(https://en.wikipedia.org/wiki/Adder_(electronics)),可以在对数时间内完成求和。 当然比较也可以在对数时间内完成。 因此,您可以使用多项式线程数进行对数时间除法。

【讨论】:

但是二进制搜索需要多项式的步数,不能并行:(.

以上是关于单片机 怎么用位移的方法实现乘除法的主要内容,如果未能解决你的问题,请参考以下文章

用单片机实现语音转文字

瑞萨单片机RL78G13和RL78G14的区别?

单片机串口通信数据可以直接进行加减乘除处理吗

怎么用51单片机来实现pwm调节占空比

STM32 M0和M3内核单片机做浮点除法运算和整型除法运算,分别的用时。希望能给大概数据参考。

Proteus仿真51单片机+74HC595驱动8X8点阵位移显示