-1

我正在尝试整理这个将 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;
 }
4

2 回答 2

3

您需要的除数是输入和输出位之间的差,提高到两个的幂。

于 2013-07-03T10:01:45.467 回答
3

Joachim 的回答为基础,如何:

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 / 1663,即 6 位值的最大值。

当然,我们可以帮助编译器,因为分母是 2 的幂:

return x >> (bitsOut - bitsIn);

这删除了除法运算符,而是直接使用 shift 来完成。

请注意,这只能丢弃位,它不能将值缩放为更多位。

于 2013-07-03T10:31:03.703 回答