【问题标题】:Encoding A Decimal Value Into a Fixed Number of Bits将十进制值编码为固定位数
【发布时间】:2014-01-15 00:00:37
【问题描述】:

我和更资深的人之间存在激烈且持续的分歧,我需要解决。因此,我转向你的互联网。现在不要让我失望!

目标是取一个十进制值并将其编码为 24 位。这是一个简单的线性刻度,因此 0x000000 是最小值,0xFFFFFF 是最大值。

我们都同意如何实现这一点的基本公式:(max-min)/range。问题是分母。对方说这应该是 1

谁是正确的?

【问题讨论】:

  • 真正的问题是:“什么是十进制的 0xFFFFFF?”。
  • 对不起,这是一个无符号值,被打包或 16777215。
  • 这有什么关系?您没有指定表示方法,您是在问 2^24 与 2^24-1 是什么。
  • 原始值为双精度值。它需要打包成 24 位,其中 0xFFFFFF 是特定双精度可以是最大值,而 0x000000 是最小值。假设我正在为汽车编码速度。 0.0 mph 表示 0x000000,150.0mph 表示为 0xFFFFFF。这是一个简单的线性比例。
  • 你在说什么?它与我的任何 cmets 无关。

标签: c encoding bit-manipulation


【解决方案1】:

如您所述,分母绝对应该是 16777215。 2^24 是 16777216 但该数字不能用 24 位数字表示。如你所说,最大数字是 2^24 - 1 (16777215) 或 0xFFFFFF。

【讨论】:

    【解决方案2】:

    我会第二次@Tejolote 的回答,因为将1 移动0 次或更多次会给你一个介于1..1677216 之间的范围。

    (32-bit number)
    0000 0000 0000 0000 0000 0000 0001 // (1 << 0)
    0001 0000 0000 0000 0000 0000 0000 // (1 << 24)
    

    如果您要获得这 24 位的位掩码,您将获得 1 到 0 的范围(可能不是您想要的):

      (mask to a 24-bit number)
      0000 0000 0000 0000 0000 0000 0001 // (1 << 0)
    & 0000 1111 1111 1111 1111 1111 1111 // mask
      ==================================
      0000 0000 0000 0000 0000 0000 0001 // result of '1', correct
    

      0001 0000 0000 0000 0000 0000 0000 // (1 << 24)
    & 0000 1111 1111 1111 1111 1111 1111 // mask
      ==================================
      0000 0000 0000 0000 0000 0000 0000 // result of '0', wrong
    

    您想要的是从 0 到 16777215 的范围:

    & 0000 0000 0000 0000 0000 0000 0000 // (1 << 0) - 1
      0000 1111 1111 1111 1111 1111 1111 // mask
      ==================================
      0000 0000 0000 0000 0000 0000 0000 // result of '0', correct
    

      0000 1111 1111 1111 1111 1111 1111 // (1 << 24) - 1
    & 0000 1111 1111 1111 1111 1111 1111 // mask
      ==================================
      0000 1111 1111 1111 1111 1111 1111 // result of '16777215', correct
    

    【讨论】:

      【解决方案3】:

      OP “假设我正在为汽车编码速度。0.0 mph 将是 0x000000,而 150.0mph 将由 0xFFFFFF 表示。这是一个简单的线性比例。”

      是的 16777215 = 0xFFFFFF - 0x000000

      0.0 --> 0x000000
      150.0 --> 0xFFFFFF
      
      y = dy/dx(x - x0) + y0 = (0xFFFFFF - 0x000000)/(150.0 - 0.0)*(x - 0.0) + 0x000000
      

      但是如果前辈认为上端的十进制值代表了一个可以接近但不能达到的速度。

      0.0 --> 0x000000
      150.0 --> 0xFFFFFF + 1
      

      16777216 = 0xFFFFFF + 1 - 0x000000

      我建议给你的长辈买一杯啤酒。向他们学习——他们作弊

      【讨论】:

        猜你喜欢
        • 2013-01-02
        • 1970-01-01
        • 2011-09-21
        • 2020-04-03
        • 2017-01-22
        • 2020-06-15
        • 1970-01-01
        • 2011-03-05
        • 1970-01-01
        相关资源
        最近更新 更多