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 的位的数量的更快方法是使用查找表。以下示例使用 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;
}