templeton 发表于 2023-10-22 12:14:49

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

在8位机中,对于部分乘除法是转换成移位操作来进行的,这样速度会快点。但对于32位的数据来说,移位操作依然比较慢。不过对于有MDU的STC8H和STC32系列芯片就不同了。可以使用MDU来计算移位或是使用乘除法替代移位操作,速度非常快啊,谁用谁知道。
使用STC32F12K54芯片测试,频率使用24Mhz。
使用移位操作计算CRC32操作,2K数据大概160ms。
uint32_t crc32b(unsigned char code * addr, uint16_t l)
{
    uint16_t i, j;
    uint32_t crc, msb;
    uint32_t message;
    crc = 0xFFFFFFFF;
    for(i = 0; i < l; i++)
    {
      // xor next byte to upper bits of crc
      message = addr;
      crc ^= ((message)<<24);
      for (j = 0; j < 8; j++)
      {    // Do eight times.
            msb = crc>>31;
            crc <<= 1;
            crc ^= (0 - msb) & 0x04C11DB7;
      }
    }
    return crc;
}

使用STC32_MDU32_LARGE_V1.1库后,
uint32_t crc32b(unsigned char code * addr, uint16_t l)
{
    uint16_t i, j;
    uint32_t crc, msb;
    uint32_t message;
    crc = 0xFFFFFFFF;
    for(i = 0; i < l; i++)
    {
      // xor next byte to upper bits of crc
      message = addr;
      crc ^= (message * 0x01000000);
      for (j = 0; j < 8; j++)
      {    // Do eight times.
            msb = (crc / 0x80000000);
            crc = crc * 2;
            crc ^= (0 - msb) & 0x04C11DB7;
      }
    }
    return crc;
}

同样的操作只要40ms,只有之前的1/4啊。另外不适用MDU,依然使用乘除法的话则需要288ms。
所以对于32位的移位操作,在使用MDU的情况下,改成乘除法也是不错的选择。
页: [1]
查看完整版本: 乘除法运算比移位操作速度还快?