找回密码
 立即注册
查看: 758|回复: 0

乘除法运算比移位操作速度还快?

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-10 08:59:03

15

主题

30

回帖

433

积分

中级会员

积分
433
发表于 2023-10-22 12:14:49 | 显示全部楼层 |阅读模式
在8位机中,对于部分乘除法是转换成移位操作来进行的,这样速度会快点。但对于32位的数据来说,移位操作依然比较慢。不过对于有MDU的STC8H和STC32系列芯片就不同了。可以使用MDU来计算移位或是使用乘除法替代移位操作,速度非常快啊,谁用谁知道。
使用STC32F12K54芯片测试,频率使用24Mhz。
使用移位操作计算CRC32操作,2K数据大概160ms。
  1. uint32_t crc32b(unsigned char code * addr, uint16_t l)
  2. {
  3.     uint16_t i, j;
  4.     uint32_t crc, msb;
  5.     uint32_t message;
  6.     crc = 0xFFFFFFFF;
  7.     for(i = 0; i < l; i++)
  8.     {
  9.         // xor next byte to upper bits of crc
  10.         message = addr[i];
  11.         crc ^= ((message)<<24);
  12.         for (j = 0; j < 8; j++)
  13.         {    // Do eight times.
  14.             msb = crc>>31;
  15.             crc <<= 1;
  16.             crc ^= (0 - msb) & 0x04C11DB7;
  17.         }
  18.     }
  19.     return crc;
  20. }
复制代码

使用STC32_MDU32_LARGE_V1.1库后,
  1. uint32_t crc32b(unsigned char code * addr, uint16_t l)
  2. {
  3.     uint16_t i, j;
  4.     uint32_t crc, msb;
  5.     uint32_t message;
  6.     crc = 0xFFFFFFFF;
  7.     for(i = 0; i < l; i++)
  8.     {
  9.         // xor next byte to upper bits of crc
  10.         message = addr[i];
  11.         crc ^= (message * 0x01000000);
  12.         for (j = 0; j < 8; j++)
  13.         {    // Do eight times.
  14.             msb = (crc / 0x80000000);
  15.             crc = crc * 2;
  16.             crc ^= (0 - msb) & 0x04C11DB7;
  17.         }
  18.     }
  19.     return crc;
  20. }
复制代码

同样的操作只要40ms,只有之前的1/4啊。另外不适用MDU,依然使用乘除法的话则需要288ms。
所以对于32位的移位操作,在使用MDU的情况下,改成乘除法也是不错的选择。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:17 , Processed in 0.641852 second(s), 45 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表