转回某事

时间:2011-10-12 16:59:41

标签: c++ colors

word color;

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

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

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

4 个答案:

答案 0 :(得分:3)

你做不到。 “和”(&)和“或”(|)没有反转(如果溢出则不会移位)。这意味着color的多个值可能会转变为crap

答案 1 :(得分:2)

  

我怀疑它与555到565种颜色之间的切换有关。

是的,这就是它正在做的事情。 color将是565表示,crap将是相应的555表示。

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

(color & 0xffc0)清除该字的后6位,删除cb的最低有效位,保留ab的最重要的5位1}}。

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

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

最后,|结合了两个值,左侧为ab,右侧为c,每个为5位。

  

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

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

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

答案 2 :(得分:1)

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

假设第五位不包含任何有用的数据,以下内容将为您提供转换的反转:

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

同样,这会恢复color ,但第五位除外。

答案 3 :(得分:0)

是的,通过删除G的最低位,它看起来像是从565 RGB转换为555 RGB。

你失去了一点,所以你不能完全反转它(G的最低位刚刚消失),但是你可以通过做这样的事情来近似反转:

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

第一部分((crap & 0xffe0) << 1)正在掩盖R和G组件并将它们重新移回。最后一部分| (crap & 0x1f)正在掩盖蓝色并将其添加回结果中。