【问题标题】:Shifting back to something回到某事
【发布时间】:2011-12-06 07:42:50
【问题描述】:
word color;

crap = ((color & 0xffc0) >> 1) | (color & 0x1f)

我有这个转换代码。我不知道这段代码的目的是什么,但我怀疑它与在 555 到 565 色之间切换有关。

如何创建一个与上面的代码完全相反的函数?这会将变量转换回原始颜色编号?

【问题讨论】:

  • (color & 0x1f) 部分没问题,但((color & 0xffc0) >> 1) 似乎是错误的,因为它没有意义。
  • 如果你不知道这段代码的目的是什么,那么你怎么能理解与上面的代码完全相反的代码?

标签: c++ colors


【解决方案1】:

你不能。 "And" (&) 和 "or" (|) 没有逆运算(如果溢出也不会移位)。这意味着color 的多个值可能会变成crap

【讨论】:

    【解决方案2】:

    我怀疑这与在 555 到 565 色之间切换有关。

    是的,它就是这么做的。 color 将是 565 表示,crap 将是相应的 555 表示。

    让我们看看每个操作的作用。我将这三个字段称为a(5 位)、b(6 位,转换为 5)和c(5 位)。

    (color & 0xffc0) 清除字的低 6 位,删除 cb 的最低有效位,保留 ab 的最高有效 5 位。

    >> 1 将这些位右移,因此我们现在有a(5 位)、b(5 位)和一个空的 5 位字段。

    (color & 0x1f) 清除除底部 5 位之外的所有位 - 也就是说,它保留 'c' 并删除其他字段。

    最后,| 组合了这两个值,从左侧给出 ab,从右侧给出 c,每个 5 位。

    如何创建一个与上面的代码完全相反的函数?这会将变量转换回原始颜色编号?

    color = ((crap & 0xffe0) << 1) | (crap & 0x1f);
    

    请注意,b 的最低有效位现在为零,无论它是从什么开始的。该信息在第一次转换中丢失,无法恢复。

    【讨论】:

      【解决方案3】:

      严格来说,你不能,因为转换会不可逆地删除color 的第五个最低有效位(它确实保留了所有其他位)。

      假设第五位一开始不包含任何有用的数据,以下将为您提供转换的逆:

      color = ((crap & 0xffe0) << 1 | (crap & 0x1f))
      

      同样,这会恢复color 除了第五位,它已经丢失了。

      【讨论】:

        【解决方案4】:

        是的,这看起来像是通过丢弃 G 的最低位从 565 RGB 转换为 555 RGB。

        你丢失了一位,所以你不能完全反转它(G 的最低位刚刚消失),但你可以通过执行以下操作来近似反转:

        color = ((crap & 0xffe0) << 1) | (crap & 0x1f)
        

        第一部分,((crap &amp; 0xffe0) &lt;&lt; 1) 只是掩盖了 R 和 G 分量并将它们向上移动。最后一部分,| (crap &amp; 0x1f),正在掩盖蓝色并将其添加回结果中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-20
          • 2010-11-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多