ZHCAAO5A June   2020  – August 2021 ADS112C04 , ADS112U04 , ADS114S06 , ADS114S08 , ADS122C04 , ADS122U04 , ADS1235 , ADS1235-Q1 , ADS124S06 , ADS124S08 , ADS1259 , ADS1259-Q1 , ADS125H01 , ADS125H02 , ADS1260 , ADS1260-Q1 , ADS1261 , ADS1262 , ADS1263 , ADS127L01 , ADS131A02 , ADS131A04 , ADS131M04 , ADS131M06 , ADS131M08

 

  1.   商标
  2. 1引言
  3. 2简单校验和
    1. 2.1 校验和代码示例
  4. 3CRC
    1. 3.1 CRC 通用计算
      1. 3.1.1 使用按位异或计算
      2. 3.1.2 使用查找表
        1. 3.1.2.1 表初始化
        2. 3.1.2.2 CRC 计算
      3. 3.1.3 ADS122U04 和 ADS122C04 之间的 CRC 计算差异
        1. 3.1.3.1 字节反射示例
        2. 3.1.3.2 使用字节反射重新组合数据以进行 CRC 计算
  5. 4汉明码
    1. 4.1 汉明码计算
      1. 4.1.1 汉明码计算示例
        1. 4.1.1.1 计算位数以进行奇偶校验和校验和计算
          1. 4.1.1.1.1 计算数据中置 1 的位的数量示例
          2. 4.1.1.1.2 使用查找表计算置 1 的位的数量示例
      2. 4.1.2 验证传输的数据
        1. 4.1.2.1 汉明验证
        2. 4.1.2.2 校验和验证
        3. 4.1.2.3 误差校正
  6. 5总结
  7. 6参考文献
  8. 7修订历史记录
使用查找表计算置 1 的位的数量示例

计算数据中置 1 的位的数量的更快方法是使用查找表。以下示例使用 4 位查找表中的数据。这需要进行八遍评估来评估 32 个位。更大的查找表可以减少评估遍数,但会增加存储器中表的大小。

uint32_t bitsArray[] = {
    0, // 0
    1, // 1
    1, // 2
    2, // 3
    1, // 4
    2, // 5
    2, // 6
    3, // 7
    1, // 8
    2, // 9
    2, // 10
    3, // 11
    2, // 12
    3, // 13
    3, // 14
    4, // 15
};
/**
 * 使用查找表计算 32 位值中置 1 的位的数量。
 *
 * \详细信息:通过使用循环,评估查找表中的每个半字节,
 * 然后将剩余值右移 4 位,来计算置 1 的位的数量。
 *
 * \参数 uint32_t in 是要计算的值。
 *
 * \返回计算得到的 uint32_t numBits。
 */
uint32_t countBits (uint32_t in)
{
    uint32_t numBits = 0;
    while (in != 0)
    {
        numBits += bitsArray[in & 0x0F];
        in >>= 4;
    }
    return numBits;
}