CN116301714A - 在mcu上实现乘法运算的方法、系统、存储介质及电子设备 - Google Patents
在mcu上实现乘法运算的方法、系统、存储介质及电子设备 Download PDFInfo
- Publication number
- CN116301714A CN116301714A CN202310046011.2A CN202310046011A CN116301714A CN 116301714 A CN116301714 A CN 116301714A CN 202310046011 A CN202310046011 A CN 202310046011A CN 116301714 A CN116301714 A CN 116301714A
- Authority
- CN
- China
- Prior art keywords
- multiplicand
- bits
- shifting
- low
- bit value
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 36
- 238000000354 decomposition reaction Methods 0.000 claims description 8
- 238000004590 computer program Methods 0.000 claims description 3
- 230000009191 jumping Effects 0.000 claims description 3
- 230000009286 beneficial effect Effects 0.000 abstract description 5
- 238000010586 diagram Methods 0.000 description 4
- 230000003111 delayed effect Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 230000007547 defect Effects 0.000 description 1
- 230000002950 deficient Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 230000035945 sensitivity Effects 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F7/00—Methods or arrangements for processing data by operating upon the order or content of the data handled
- G06F7/38—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
- G06F7/48—Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
- G06F7/52—Multiplying; Dividing
- G06F7/523—Multiplying only
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Engineering & Computer Science (AREA)
- Computational Mathematics (AREA)
- Mathematical Analysis (AREA)
- Mathematical Optimization (AREA)
- Pure & Applied Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- General Engineering & Computer Science (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本发明公开了在MCU上实现乘法运算的方法、系统、存储介质及电子设备,被乘数和乘数为整数,要进行二进制乘法运算,该方法包括:识别乘数中的每一数位,根据识别到的数位将被乘数左移相应位数,得到被乘数的移位值,将所有被乘数的移位值相加,得到积。本发明在资源受限的MCU上实现乘法是通过加法和移位运算,能够解决廉价MCU并未内置浮点运算器,或者因编译器不能很好地支持乘法等原因,无法直接使用乘法运算的问题,从而节约了器件成本,无需更换MCU,又满足了开发需求,有助于提高产品的竞争力。
Description
技术领域
本发明涉及在嵌入式系统技术领域,尤其涉及一种在MCU上实现乘法运算的方法、系统、存储介质及电子设备。
背景技术
嵌入式系统中,由于产品对成本的高度敏感性,通常会选用资源有限的MCU以节省成本。这些MCU能够满足绝大多数应用需要,但有些场合需要用到乘法,例如由电压和电流相乘求得功率。遗憾的是,廉价MCU并未内置浮点运算器,或者编译器不支持乘法运算,或者有缺陷,例如支持的范围太小、精度太差。倘若为此更换支持乘法的MCU,不仅增加了成本,还会因为MCU架构的改变,增加开发工作量,延误产品投放市场的时间,错过商机。
发明内容
本发明要解决的技术问题在于,针对上述背景技术中提及的相关技术存在的至少一个缺陷:廉价MCU并未内置浮点运算器,或者编译器不支持乘法运算,或者有缺陷,倘若为此更换支持乘法的MCU,不仅增加了成本,还会因为MCU架构的改变,增加开发工作量,延误产品投放市场的时间,错过商机,提供一种在MCU上实现乘法运算的方法、系统、存储介质及电子设备。
本发明解决其技术问题所采用的技术方案是:构造一种在MCU上实现乘法运算的方法,被乘数和乘数为整数,要进行二进制乘法运算,包括步骤S1:
识别所述乘数中的每一数位;
根据识别到的数位将所述被乘数左移相应位数,得到所述被乘数的移位值;
将所有所述被乘数的移位值相加,得到积。
优选地,在本发明所述的在MCU上实现乘法运算的方法中,步骤S1包括:
S11:将所述积的初始值设为0;
S12:判断所述被乘数和所述乘数中的任一个是否为0,若是,则返回积的最终值为0;若否,则执行S13;
S13:从所述乘数的最低位依次向上遍历,若数位为1,则将所述积加上所述被乘数左移相应位数的值,重复执行该步骤,直至遍历完所述乘数的所有数位,得到所述积的最终值。
优选地,在本发明所述的在MCU上实现乘法运算的方法中,所述方法还包括:
S0:当所述MCU或编译器不支持8位整数乘法运算时,执行S1;当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为16位整数时,执行S2;
S2:将所述被乘数和所述乘数分别分解为8位的高、低字节整数;
S3:将所述被乘数的高字节整数与所述乘数的高字节整数相乘后左移16位;
将所述被乘数的高字节整数与所述乘数的低字节整数相乘后左移8位;
将所述被乘数的低字节整数与所述乘数的高字节整数相乘后左移8位;
将所述被乘数的低字节整数与所述乘数的低字节整数相乘;
将所有运算结果相加,得到所述积。
优选地,在本发明所述的在MCU上实现乘法运算的方法中,所述方法还包括:
S0:当所述MCU或编译器不支持8位整数乘法运算时,执行S1;当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为32位整数时,执行S4;
S4:取所述被乘数和所述乘数的低8位值,以及将所述被乘数和所述乘数分别右移24、16和8位后得到各低8位值;
S5:将所述被乘数右移24位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移48位;
将所述被乘数右移24位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移40位;
将所述被乘数右移24位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移24位后得到的低8位值与所述乘数的低8位值相乘后,再左移24位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移40位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移24位;
将所述被乘数右移16位后得到的低8位值与所述乘数的低8位值相乘后,再左移16位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移24位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移16位;
将所述被乘数右移8位后得到的与所述乘数的低8位值相乘后,再左移8位;
将所述被乘数的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移24位;
将所述被乘数的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移16位;
将所述被乘数的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移8位;
将所述被乘数的低8位值与所述乘数的低8位值相乘后,再转换为64位;
将所有运算结果相加,得到所述积。
优选地,在本发明所述的在MCU上实现乘法运算的方法中,步骤S5还包括:
将所有运算结果放到m[4][4]数组中。
本发明还构造了一种在MCU上实现乘法运算的系统,被乘数和乘数为整数,要进行二进制乘法运算,包括:
第一运算模块,用于识别所述乘数中的每一数位,根据识别到的数位将所述被乘数左移相应位数,得到所述被乘数的移位值,将所有所述被乘数的移位值相加,得到积。
优选地,在本发明所述的在MCU上实现乘法运算的系统中,所述第一运算模块包括:
初始化单元,用于将所述积的初始值设为0;
判断单元,用于判断所述被乘数和所述乘数中的任一个是否为0,若是,则返回所述积的最终值为0;若否,则跳转至运算单元;
运算单元,用于从所述乘数的最低位依次向上遍历,若数位为1,则将所述积加上所述被乘数左移相应位数的值,重复执行,直至遍历完所述乘数的所有数位,得到所述积的最终值。
优选地,在本发明所述的在MCU上实现乘法运算的系统中,所述系统还包括:
分解模块,用于将所述被乘数和所述乘数分别分解为8位的高、低字节整数;
第二运算模块,用于将所述被乘数的高字节整数与所述乘数的高字节整数相乘后左移16位;以及,将所述被乘数的高字节整数与所述乘数的低字节整数相乘后左移8位;以及,将所述被乘数的低字节整数与所述乘数的高字节整数相乘后左移8位;以及,将所述被乘数的低字节整数与所述乘数的低字节整数相乘;以及,将所有运算结果相加,得到所述积;
取值模块,用于所述被乘数和所述乘数为32位整数时,取所述被乘数和所述乘数的低8位值,以及将所述被乘数和所述乘数分别右移24、16和8位后得到各低8位值;
第三运算模块,用于将所述被乘数右移24位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移48位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移40位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数的低8位值相乘后,再左移24位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移40位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数的低8位值相乘后,再左移16位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移16位;以及,将所述被乘数右移8位后得到的与所述乘数的低8位值相乘后,再左移8位;以及,将所述被乘数的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移16位;以及,将所述被乘数的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移8位;以及,将所述被乘数的低8位值与所述乘数的低8位值相乘后,再转换为64位;以及,将所有运算结果相加,得到所述积;
其中,当所述MCU或编译器不支持8位整数乘法运算时,运行所述第一运算模块;
当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为16位整数时,运行所述分解模块和所述第二运算模块;
当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为32位整数时,运行所述取值模块和所述第三运算模块。
本发明还构造了一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如上述任一项所述的在MCU上实现乘法运算的方法。
本发明还构造了一种电子设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如上述任一项所述的在MCU上实现乘法运算的方法。
通过实施本发明,具有以下有益效果:
本发明在资源受限的MCU上实现乘法是通过加法和移位运算,能够解决廉价MCU并未内置浮点运算器,或者因编译器不能很好地支持乘法等原因,无法直接使用乘法运算的问题,从而节约了器件成本,无需更换MCU,又满足了开发需求,有助于提高产品的竞争力。
附图说明
下面将结合附图及实施例对本发明作进一步说明,附图中:
图1是本发明在MCU上实现乘法运算的方法流程图;
图2是本发明在MCU上实现乘法运算的方法中步骤S1的具体流程图;
图3是本发明在不支持8位整数乘法运算的MCU或编译器上实现乘法运算的系统模块框图;
图4是本发明在支持8位整数乘法运的MCU和编译器上实现乘法运算的系统模块框图。
具体实施方式
为了对本发明的技术特征、目的和效果有更加清楚的理解,现对照附图详细说明本发明的具体实施方式。
需要说明的是,附图中所示的流程图仅是示例性说明,不是必须包括所有的内容和操作/步骤,也不是必须按所描述的顺序执行。例如,有的操作/步骤还可以分解,而有的操作/步骤可以合并或部分合并,因此实际执行的顺序有可能根据实际情况改变。
附图中所示的方框图仅仅是功能实体,不一定必须与物理上独立的实体相对应。即,可以采用软件形式来实现这些功能实体,或在一个或多个硬件模块或集成电路中实现这些功能实体,或在不同网络和/或处理器装置和/或微控制器装置中实现这些功能实体。
如图1所示,本发明的一个实施例公开了一种在MCU上实现乘法运算的方法,用于在嵌入式系统中利用整数等基本数据类型实现乘法,而不要求MCU有浮点运算能力等资源支持,其中被乘数和乘数为整数,要进行二进制乘法运算,该方法包括步骤S1:
识别乘数中的每一数位,根据识别到的数位将被乘数左移相应位数,得到被乘数的移位值,将所有被乘数的移位值相加,得到积。
具体地,步骤S1包括:
S11:将积的初始值设为0;
S12:判断被乘数和乘数中的任一个是否为0,若是,则返回积的最终值为0;若否,则执行S13;
S13:从乘数的最低位依次向上遍历,若数位为1,则将积加上被乘数左移相应位数的值,重复执行该步骤,直至遍历完乘数的所有数位,得到积的最终值。
在此以16位无符号整数为例说明算法的原理。假定被乘数A、乘数B为16位无符号整数,积为C。为实现全范围的A、B乘法,C需要为32位无符号整数才能存储完整的运算结果。
运算过程如图2所示:
a.将C初值设为0,数位i设为0;
b.倘若A或B任一个为0,直接返回C值为0;
c.从B的最低位依次向上遍历,如果数位为1,则将C加上A移位这么多位数的值;
d.重复步骤c,直到B的所有16位都遍历完成,得到的C即为A和B乘积。
本实施例中,该方法还包括:
S0:当MCU或编译器不支持8位整数乘法运算时,执行S1;当MCU和编译器支持8位整数乘法运算且被乘数和乘数为16位整数时,执行S2;
S2:将被乘数和乘数分别分解为8位的高、低字节整数;
S3:将被乘数的高字节整数与乘数的高字节整数相乘后左移16位;
将被乘数的高字节整数与乘数的低字节整数相乘后左移8位;
将被乘数的低字节整数与乘数的高字节整数相乘后左移8位;
将被乘数的低字节整数与乘数的低字节整数相乘;
将所有运算结果相加,得到积。
具体地,有些MCU或编译器只能做8位无符号整数乘法运算,范围太小,无法满足应用需要。这种情况下可以直接摒弃乘法能力,直接采用前述的二进制乘法运算;或采用上述方法利用MCU的8位无符号整数乘法运算能力,实现更大范围的乘法运算。
以MCU和编译器支持8位整数乘法运算,被乘数A和乘数B为16位无符号整数为例,将被乘数A和乘数B分别看作8位无符号整数的组合,因此将被乘数A和乘数B分解为4个8位无符号整数的乘法运算,即如下表1所示的被乘数A的高字节AH(高字节整数)和低字节AL(低字节整数),乘数B的高字节BH(高字节整数)和低字节BL(低字节整数)。
表1
AH | AL | |
BH | (AH*BH)<<16 | (AL*BH)<<8 |
BL | (AH*BL)<<8 | AL*BL |
将AH与BH相乘后左移16位,将AH与BL相乘后左移8位,将AL与BH相乘后左移8位,将AL与BL相乘,最后将所有运算结果相加,得到正确的A与B的积。
在其他一些实施例中,MCU和编译器支持16位整数乘法运算,被乘数A和乘数B为32位无符号整数,被乘数A和乘数B分别分解为16位的高、低位字,原理与上述步骤S2和S3相同,在此不再赘述。在其他一些实施例中,MCU和编译器支持32位整数乘法运算,被乘数A和乘数B为64位无符号整数,原理与上述步骤S2和S3相同,在此不再赘述。因此,只要MCU和编译器支持2^x位整数乘法运算,被乘数和乘数为2^(x+1)位整数,即可通用。
本实施例中,该方法还包括:
S0:当MCU或编译器不支持8位整数乘法运算时,执行S1;当MCU和编译器支持8位整数乘法运算且被乘数和乘数为32位整数时,执行S4;
S4:取被乘数和乘数的低8位值,以及将被乘数和乘数分别右移24、16和8位后得到各低8位值;
S5:将被乘数右移24位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移48位,即(u8)(A>>24)* (u8)(B>>24)后再左移48位;
将被乘数右移24位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移40位,即(u8)(A>>24)* (u8)(B>>16)后再左移40位;
将被乘数右移24位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移32位,即(u8)(A>>24)* (u8)(B>>8)后再左移32位;
将被乘数右移24位后得到的低8位值与乘数的低8位值相乘后,再左移24位,即(u8)(A>>24)* (u8)B后再左移24位;
将被乘数右移16位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移40位,即(u8)(A>>16)* (u8)(B>>24)后再左移40位;
将被乘数右移16位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移32位,即(u8)(A>>16)* (u8)(B>>16)后再左移32位;
将被乘数右移16位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移24位,即(u8)(A>>16)* (u8)(B>>8)后再左移24位;
将被乘数右移16位后得到的低8位值与乘数的低8位值相乘后,再左移16位,即(u8)(A>>16)* (u8)B后再左移16位;
将被乘数右移8位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移32位,即(u8)(A>>8)* (u8)(B>>24)后再左移32位;
将被乘数右移8位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移24位,即(u8)(A>>8)* (u8)(B>>16)后再左移24位;
将被乘数右移8位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移16位,即(u8)(A>>8)* (u8)(B>>8)后再左移16位;
将被乘数右移8位后得到的与乘数的低8位值相乘后,再左移8位,即(u8)(A>>8)*(u8)B后再左移8位;
将被乘数的低8位值与乘数右移24位后得到的低8位值相乘后,再左移24位,即(u8)A * (u8)(B>>24)后再左移24位;
将被乘数的低8位值与乘数右移16位后得到的低8位值相乘后,再左移16位,即(u8)A * (u8)(B>>16)后再左移16位;
将被乘数的低8位值与乘数右移8位后得到的低8位值相乘后,再左移8位,即(u8)A* (u8)(B>>8)后再左移8位;
将被乘数的低8位值与乘数的低8位值相乘后,再转换为64位,即(u8)A * (u8)B后再转换为64位;
将所有运算结果相加,得到积。
优选地,为确保运算结果的可读性,步骤S5还包括:将所有运算结果放到m[4][4]数组中,以提高程序可读性、方便求和操作,如下表2所示。
上述步骤S4和S5是以MCU和编译器支持8位整数乘法运算,被乘数A和乘数B为32位无符号整数为例进行说明的,因为MCU和编译器只能进行8位无符号整数相乘,所以乘法运算前先将32位的A和B分别右移位后得到低8位值,运算后再左移回去,才是两个对应字节正确的乘法结果,最后将m[4][4]数组的全部元素值加在一起即可得到等效的乘法运算结果。
表2
8位数运算结果 | (u8)(A>>24) | (u8)(A>>16) | (u8)(A>>8) | (u8)A |
(u8)(B>>24) | m[3][3] | m[2][3] | m[1][3] | m[0][3] |
(u8)(B>>16) | m[3][2] | m[2][2] | m[1][2] | m[0][2] |
(u8)(B>>8) | m[3][1] | m[2][1] | m[1][1] | m[0][1] |
(u8)B | m[3][0] | m[2][0] | m[1][0] | m[0][0] |
在其他一些实施例中,MCU和编译器支持16位整数乘法运算,被乘数A和乘数B为64位无符号整数,原理与上述步骤S4和S5相同,在此不再赘述。因此,只要MCU和编译器支持2^x位整数乘法运算,被乘数和乘数为2^(x+N)位整数,即可通用。
如图3所示,本发明的一个实施例公开了一种在MCU上实现乘法运算的系统,被乘数和乘数为整数,要进行二进制乘法运算,包括:
第一运算模块,用于识别乘数中的每一数位,根据识别到的数位将被乘数左移相应位数,得到被乘数的移位值,将所有被乘数的移位值相加,得到积。
具体地,第一运算模块包括:
初始化单元,用于将积的初始值设为0;
判断单元,用于判断被乘数和乘数中的任一个是否为0,若是,则返回所述积的最终值为0;若否,则跳转至运算单元;
运算单元,用于从乘数的最低位依次向上遍历,若数位为1,则将积加上被乘数左移相应位数的值,重复执行,直至遍历完乘数的所有数位,得到积的最终值。
在此以16位无符号整数为例说明算法的原理。假定被乘数A、乘数B为16位无符号整数,积为C。为实现全范围的A、B乘法,C需要为32位无符号整数才能存储完整的运算结果。
运算过程如图2所示:
a.将C初值设为0,数位i设为0;
b.倘若A或B任一个为0,直接返回C值为0;
c.从B的最低位依次向上遍历,如果数位为1,则将C加上A移位这么多位数的值;
d.重复步骤c,直到B的所有16位都遍历完成,得到的C即为A和B乘积。
本实施例中,如图4所示,该系统还包括:
分解模块,用于将被乘数和乘数分别分解为8位的高、低字节整数;
第二运算模块,用于将被乘数的高字节整数与乘数的高字节整数相乘后左移16位;以及,将被乘数的高字节整数与乘数的低字节整数相乘后左移8位;以及,将被乘数的低字节整数与乘数的高字节整数相乘后左移8位;以及,将被乘数的低字节整数与乘数的低字节整数相乘;以及,将所有运算结果相加,得到积。
其中,当MCU和编译器支持8位整数乘法运算且被乘数和乘数为16位整数时,运行分解模块和所述第二运算模块。
具体地,有些MCU或编译器只能做8位无符号整数乘法运算,范围太小,无法满足应用需要。这种情况下可以直接摒弃乘法能力,直接采用前述的二进制乘法运算;或采用上述方法利用MCU的8位无符号整数乘法运算能力,实现更大范围的乘法运算。
以MCU和编译器支持8位整数乘法运算,被乘数A和乘数B为16位无符号整数为例,将被乘数A和乘数B分别看作8位无符号整数的组合,因此将被乘数A和乘数B分解为4个8位无符号整数的乘法运算,即如下表1所示的被乘数A的高字节AH(高字节整数)和低字节AL(低字节整数),乘数B的高字节BH(高字节整数)和低字节BL(低字节整数)。
表1
AH | AL | |
BH | (AH*BH)<<16 | (AL*BH)<<8 |
BL | (AH*BL)<<8 | AL*BL |
将AH与BH相乘后左移16位,将AH与BL相乘后左移8位,将AL与BH相乘后左移8位,将AL与BL相乘,最后将所有运算结果相加,得到正确的A与B的积。
在其他一些实施例中,MCU和编译器支持16位整数乘法运算,被乘数A和乘数B为32位无符号整数,被乘数A和乘数B分别分解为16位的高、低位字,原理与上述分解模块和第二运算模块相同,在此不再赘述。在其他一些实施例中,MCU和编译器支持32位整数乘法运算,被乘数A和乘数B为64位无符号整数,原理与上述分解模块和第二运算模块相同,在此不再赘述。因此,只要MCU和编译器支持2^x位整数乘法运算,被乘数和乘数为2^(x+1)位整数,即可通用。
本实施例中,该系统还包括:
取值模块,用于被乘数和乘数为32位整数时,取被乘数和乘数的低8位值,以及将被乘数和乘数分别右移24、16和8位后得到各低8位值。
第三运算模块,用于将被乘数右移24位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移48位,即(u8)(A>>24)* (u8)(B>>24)后再左移48位;
将被乘数右移24位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移40位,即(u8)(A>>24)* (u8)(B>>16)后再左移40位;
将被乘数右移24位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移32位,即(u8)(A>>24)* (u8)(B>>8)后再左移32位;
将被乘数右移24位后得到的低8位值与乘数的低8位值相乘后,再左移24位,即(u8)(A>>24)* (u8)B后再左移24位;
将被乘数右移16位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移40位,即(u8)(A>>16)* (u8)(B>>24)后再左移40位;
将被乘数右移16位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移32位,即(u8)(A>>16)* (u8)(B>>16)后再左移32位;
将被乘数右移16位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移24位,即(u8)(A>>16)* (u8)(B>>8)后再左移24位;
将被乘数右移16位后得到的低8位值与乘数的低8位值相乘后,再左移16位,即(u8)(A>>16)* (u8)B后再左移16位;
将被乘数右移8位后得到的低8位值与乘数右移24位后得到的低8位值相乘后,再左移32位,即(u8)(A>>8)* (u8)(B>>24)后再左移32位;
将被乘数右移8位后得到的低8位值与乘数右移16位后得到的低8位值相乘后,再左移24位,即(u8)(A>>8)* (u8)(B>>16)后再左移24位;
将被乘数右移8位后得到的低8位值与乘数右移8位后得到的低8位值相乘后,再左移16位,即(u8)(A>>8)* (u8)(B>>8)后再左移16位;
将被乘数右移8位后得到的与乘数的低8位值相乘后,再左移8位,即(u8)(A>>8)*(u8)B后再左移8位;
将被乘数的低8位值与乘数右移24位后得到的低8位值相乘后,再左移24位,即(u8)A * (u8)(B>>24)后再左移24位;
将被乘数的低8位值与乘数右移16位后得到的低8位值相乘后,再左移16位,即(u8)A * (u8)(B>>16)后再左移16位;
将被乘数的低8位值与乘数右移8位后得到的低8位值相乘后,再左移8位,即(u8)A* (u8)(B>>8)后再左移8位;
将被乘数的低8位值与乘数的低8位值相乘后,再转换为64位,即(u8)A * (u8)B后再转换为64位;
将所有运算结果相加,得到积。
其中,当MCU或编译器不支持8位整数乘法运算时,运行第一运算模块;当MCU和编译器支持8位整数乘法运算且被乘数和乘数为32位整数时,运行取值模块和第三运算模块。
优选地,为确保运算结果的可读性,第三运算模块还用于将所有运算结果放到m[4][4]数组中,以提高程序可读性、方便求和操作,如下表2所示。
上述取值模块和第三运算模块是以MCU和编译器支持8位整数乘法运算,被乘数A和乘数B为32位无符号整数为例进行说明的,因为MCU和编译器只能进行8位无符号整数相乘,所以乘法运算前先将32位的A和B分别右移位后得到低8位值,运算后再左移回去,才是两个对应字节正确的乘法结果,最后将m[4][4]数组的全部元素值加在一起即可得到等效的乘法运算结果。
表2
8位数运算结果 | (u8)(A>>24) | (u8)(A>>16) | (u8)(A>>8) | (u8)A |
(u8)(B>>24) | m[3][3] | m[2][3] | m[1][3] | m[0][3] |
(u8)(B>>16) | m[3][2] | m[2][2] | m[1][2] | m[0][2] |
(u8)(B>>8) | m[3][1] | m[2][1] | m[1][1] | m[0][1] |
(u8)B | m[3][0] | m[2][0] | m[1][0] | m[0][0] |
在其他一些实施例中,MCU和编译器支持16位整数乘法运算,被乘数A和乘数B为64位无符号整数,原理与上述取值模块和第三运算模块相同,在此不再赘述。因此,只要MCU和编译器支持2^x位整数乘法运算,被乘数和乘数为2^(x+N)位整数,即可通用。
本发明的一个实施例公开了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现如上述实施例所述的在MCU上实现乘法运算的方法。
本发明的一个实施例公开了一种电子设备,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,当一个或多个程序被一个或多个处理器执行时,使得一个或多个处理器实现如上述实施例所述的在MCU上实现乘法运算的方法。
在此需要说明是,不管MCU为何种MCU,8位、16位、32位甚至64位MCU,不管是否自带浮点运算器,不管编译器是否完善支持乘法,均在保护之列。且参与运算的数据类型,不限于前述算法描述中的16位无符号整数类型,并包含自定义的数据类型,例如有符号整数等,均在保护之列。
通过实施本发明,具有以下有益效果:
本发明在资源受限的MCU上实现乘法是通过加法和移位运算,能够解决廉价MCU并未内置浮点运算器,或者因编译器不能很好地支持乘法等原因,无法直接使用乘法运算的问题,从而节约了器件成本,无需更换MCU,又满足了开发需求,有助于提高产品的竞争力。
可以理解的,以上实施例仅表达了本发明的部分实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制;应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,可以对上述实施例或技术特点进行自由组合,还可以做出若干变形和改进,这些都属于本发明的保护范围,即“在一些实施例”所描述的实施例可与上下任一实施例进行自由组合;因此,凡跟本发明权利要求范围所做的等同变换与修饰,均应属于本发明权利要求的涵盖范围。
Claims (10)
1.一种在MCU上实现乘法运算的方法,其特征在于,被乘数和乘数为整数,要进行二进制乘法运算,包括步骤S1:
识别所述乘数中的每一数位;
根据识别到的数位将所述被乘数左移相应位数,得到所述被乘数的移位值;
将所有所述被乘数的移位值相加,得到积。
2.根据权利要求1所述的在MCU上实现乘法运算的方法,其特征在于,步骤S1包括:
S11:将所述积的初始值设为0;
S12:判断所述被乘数和所述乘数中的任一个是否为0,若是,则返回积的最终值为0;若否,则执行S13;
S13:从所述乘数的最低位依次向上遍历,若数位为1,则将所述积加上所述被乘数左移相应位数的值,重复执行该步骤,直至遍历完所述乘数的所有数位,得到所述积的最终值。
3.根据权利要求1所述的在MCU上实现乘法运算的方法,其特征在于,所述方法还包括:
S0:当所述MCU或编译器不支持8位整数乘法运算时,执行S1;当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为16位整数时,执行S2;
S2:将所述被乘数和所述乘数分别分解为8位的高、低字节整数;
S3:将所述被乘数的高字节整数与所述乘数的高字节整数相乘后左移16位;
将所述被乘数的高字节整数与所述乘数的低字节整数相乘后左移8位;
将所述被乘数的低字节整数与所述乘数的高字节整数相乘后左移8位;
将所述被乘数的低字节整数与所述乘数的低字节整数相乘;
将所有运算结果相加,得到所述积。
4.根据权利要求1所述的在MCU上实现乘法运算的方法,其特征在于, 所述方法还包括:
S0:当所述MCU或编译器不支持8位整数乘法运算时,执行S1;当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为32位整数时,执行S4;
S4:取所述被乘数和所述乘数的低8位值,以及将所述被乘数和所述乘数分别右移24、16和8位后得到各低8位值;
S5:将所述被乘数右移24位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移48位;
将所述被乘数右移24位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移40位;
将所述被乘数右移24位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移24位后得到的低8位值与所述乘数的低8位值相乘后,再左移24位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移40位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移16位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移24位;
将所述被乘数右移16位后得到的低8位值与所述乘数的低8位值相乘后,再左移16位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移32位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移24位;
将所述被乘数右移8位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移16位;
将所述被乘数右移8位后得到的与所述乘数的低8位值相乘后,再左移8位;
将所述被乘数的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移24位;
将所述被乘数的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移16位;
将所述被乘数的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移8位;
将所述被乘数的低8位值与所述乘数的低8位值相乘后,再转换为64位;
将所有运算结果相加,得到所述积。
5.根据权利要求4所述的在MCU上实现乘法运算的方法,其特征在于,步骤S5还包括:
将所有运算结果放到m[4][ 4]数组中。
6.一种在MCU上实现乘法运算的系统,被乘数和乘数为整数,要进行二进制乘法运算,其特征在于,包括:
第一运算模块,用于识别所述乘数中的每一数位,根据识别到的数位将所述被乘数左移相应位数,得到所述被乘数的移位值,将所有所述被乘数的移位值相加,得到积。
7.根据权利要求6所述的在MCU上实现乘法运算的系统,其特征在于,所述第一运算模块包括:
初始化单元,用于将所述积的初始值设为0;
判断单元,用于判断所述被乘数和所述乘数中的任一个是否为0,若是,则返回所述积的最终值为0;若否,则跳转至运算单元;
运算单元,用于从所述乘数的最低位依次向上遍历,若数位为1,则将所述积加上所述被乘数左移相应位数的值,重复执行,直至遍历完所述乘数的所有数位,得到所述积的最终值。
8.根据权利要求6所述的在MCU上实现乘法运算的系统,其特征在于,所述系统还包括:
分解模块,用于将所述被乘数和所述乘数分别分解为8位的高、低字节整数;
第二运算模块,用于将所述被乘数的高字节整数与所述乘数的高字节整数相乘后左移16位;以及,将所述被乘数的高字节整数与所述乘数的低字节整数相乘后左移8位;以及,将所述被乘数的低字节整数与所述乘数的高字节整数相乘后左移8位;以及,将所述被乘数的低字节整数与所述乘数的低字节整数相乘;以及,将所有运算结果相加,得到所述积;
取值模块,用于所述被乘数和所述乘数为32位整数时,取所述被乘数和所述乘数的低8位值,以及将所述被乘数和所述乘数分别右移24、16和8位后得到各低8位值;
第三运算模块,用于将所述被乘数右移24位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移48位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移40位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移24位后得到的低8位值与所述乘数的低8位值相乘后,再左移24位;以及,
将所述被乘数右移16位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移40位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数右移16位后得到的低8位值与所述乘数的低8位值相乘后,再左移16位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移32位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数右移8位后得到的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移16位;以及,将所述被乘数右移8位后得到的与所述乘数的低8位值相乘后,再左移8位;以及,将所述被乘数的低8位值与所述乘数右移24位后得到的低8位值相乘后,再左移24位;以及,将所述被乘数的低8位值与所述乘数右移16位后得到的低8位值相乘后,再左移16位;以及,将所述被乘数的低8位值与所述乘数右移8位后得到的低8位值相乘后,再左移8位;以及,将所述被乘数的低8位值与所述乘数的低8位值相乘后,再转换为64位;以及,将所有运算结果相加,得到所述积;
其中,当所述MCU或编译器不支持8位整数乘法运算时,运行所述第一运算模块;
当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为16位整数时,运行所述分解模块和所述第二运算模块;
当所述MCU和编译器支持8位整数乘法运算且所述被乘数和所述乘数为32位整数时,运行所述取值模块和所述第三运算模块。
9.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-5任一项所述的在MCU上实现乘法运算的方法。
10.一种电子设备,其特征在于,包括:
一个或多个处理器;
存储装置,用于存储一个或多个程序,当所述一个或多个程序被所述一个或多个处理器执行时,使得所述一个或多个处理器实现如权利要求1-5任一项所述的在MCU上实现乘法运算的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310046011.2A CN116301714A (zh) | 2023-01-30 | 2023-01-30 | 在mcu上实现乘法运算的方法、系统、存储介质及电子设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310046011.2A CN116301714A (zh) | 2023-01-30 | 2023-01-30 | 在mcu上实现乘法运算的方法、系统、存储介质及电子设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116301714A true CN116301714A (zh) | 2023-06-23 |
Family
ID=86796755
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310046011.2A Pending CN116301714A (zh) | 2023-01-30 | 2023-01-30 | 在mcu上实现乘法运算的方法、系统、存储介质及电子设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116301714A (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116774966A (zh) * | 2023-08-22 | 2023-09-19 | 深圳比特微电子科技有限公司 | 乘法器、乘累加电路、运算电路、处理器和计算装置 |
-
2023
- 2023-01-30 CN CN202310046011.2A patent/CN116301714A/zh active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN116774966A (zh) * | 2023-08-22 | 2023-09-19 | 深圳比特微电子科技有限公司 | 乘法器、乘累加电路、运算电路、处理器和计算装置 |
CN116774966B (zh) * | 2023-08-22 | 2023-12-08 | 深圳比特微电子科技有限公司 | 乘法器、乘累加电路、运算电路、处理器和计算装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20210349692A1 (en) | Multiplier and multiplication method | |
US10949168B2 (en) | Compressing like-magnitude partial products in multiply accumulation | |
US20040071041A1 (en) | DSP unit for multi-level global accumulation | |
CN110515589B (zh) | 乘法器、数据处理方法、芯片及电子设备 | |
CN116301714A (zh) | 在mcu上实现乘法运算的方法、系统、存储介质及电子设备 | |
CN111381808B (zh) | 乘法器、数据处理方法、芯片及电子设备 | |
CN113126954B (zh) | 浮点数乘法计算的方法、装置和算术逻辑单元 | |
WO2019182943A1 (en) | Stochastic rounding logic | |
CN109388373A (zh) | 用于低功耗内核的乘除法器 | |
US20220004386A1 (en) | Compute array of a processor with mixed-precision numerical linear algebra support | |
CN116225370A (zh) | 在mcu上实现除法运算的方法、系统、存储介质及电子设备 | |
CN115827555B (zh) | 数据处理方法、计算机设备、存储介质和乘法器结构 | |
CN110147217B (zh) | 除法器 | |
US7672989B2 (en) | Large number multiplication method and device | |
US20040117423A1 (en) | Signed integer long division apparatus and methods for use with processors | |
US10635395B2 (en) | Architecture and instruction set to support interruptible floating point division | |
CN209895329U (zh) | 乘法器 | |
CN114327365A (zh) | 数据处理方法、装置、设备及计算机可读存储介质 | |
CN113504892A (zh) | 一种设计乘法器查找表的方法、系统、设备及介质 | |
CN116382782A (zh) | 向量运算方法、向量运算器、电子设备和存储介质 | |
CN110427172A (zh) | 浮点数处理方法、装置、设备及计算机可读存储介质 | |
US9804998B2 (en) | Unified computation systems and methods for iterative multiplication and division, efficient overflow detection systems and methods for integer division, and tree-based addition systems and methods for single-cycle multiplication | |
US20240069868A1 (en) | Mac operator related to correcting a computational error | |
CN116225366B (zh) | 应用于嵌入式流水cpu内核的乘法指令扩展方法及装置 | |
JP2583599B2 (ja) | 2進整数乗算処理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |