我正在尝试整理这个将 10 位值转换为 6 位值的函数。当我使用更高分辨率的 ADC 时,我还需要能够定义输入的位长度:
BYTE ioGetADC (void)
{
BYTE r;
ConvertADC(); // Start Conversion
while(BusyADC()); // Wait for completion
{
r = ( (ReadADC())/16); // Read result and convert to 0-63 (returns 10bit right hand justified)
}
return r;
}
最佳答案
构建于 Joachim's answer ,怎么样:
uint32_t dropBits(uint32_t x, uint8_t bitsIn, uint8_t bitsOut)
{
return x / (1 << (bitsOut - bitsIn));
}
例如,如果我们调用 dropBits(1023, 10, 6)
要将 10 位整数的最大值缩放为 6 位,它将返回 1023 / (1 << 4)
这是 1023 / 16
即 63,6 位值的最大值。
当然,我们可能会想要帮助编译器,因为分母是 2 的幂:
return x >> (bitsOut - bitsIn);
这会删除除法运算符,而是直接使用移位来实现。
请注意,这只能删除位,它不能将值缩放为更多位。
关于转换为6位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17444941/