【问题标题】:Convert to 6bit转换为 6 位
【发布时间】:2013-06-30 23:06:47
【问题描述】:

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

【问题讨论】:

  • ADC 可以将位设置为左对齐或右对齐。小端或大端。在不知道 ADC 输出格式的情况下,没有人可以回答这个问题。
  • @Lundin - 从发布的代码中可以明显看出单词中位的合理性。
  • @ChrisStratton 不,不是。我们不知道ReadADC 做了什么。如果代码按预期工作,他就不会问问题了,是吗?
  • @Lundin - 请阅读问题的实际措辞。它不要求帮助使代码工作,而是帮助“整理”并使其对各种输入长度更加通用。对于给定代码与问题文本一致的输入数据,只有一种可能的对齐方式。而且您关于字节序的问题完全是虚假的,因为我们没有直接访问内存。
  • @Lundin:ADC 是左对齐还是右对齐都不是问题。如果它是一个 16 位寄存器左对齐,则将其视为 16 位值,如果它右对齐,则将其视为 10 位值。你在发明没有的问题。

标签: c embedded adc analog-digital-converter


【解决方案1】:

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 &lt;&lt; 4)1023 / 16 即 63,即 6 位值的最大值.

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

return x >> (bitsOut - bitsIn);

这会删除除法运算符,而是直接使用移位来完成。

请注意,这只能删除位,不能将值缩放为更多位。

【讨论】:

  • 表达式应该是(bitsIn - bitsOut)。为了通用性,您可能需要选择那个或x &lt;&lt; (bitsOut - bitsIn),具体取决于bitsIn &gt; bitsOut,例如,您可以将10 位输入转换为16 位。
【解决方案2】:

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

【讨论】:

  • 谢谢。如果没有 ,我怎么能做到这一点,空间在我的应用程序中很重要。
  • 使用位移运算而不是除法!
猜你喜欢
  • 2015-11-24
  • 2021-06-13
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 1970-01-01
相关资源
最近更新 更多