我正在尝试整理这个将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;
}
答案 0 :(得分:3)
你需要的除数是输入和输出位之间的差值,提高到2的幂。
答案 1 :(得分:3)
以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);
这将删除除法运算符,而是直接使用换档。
请注意,这只能 drop 位,不能将值缩放为更多位。