word color;
crap = ((color & 0xffc0) >> 1) | (color & 0x1f)
我有这个转换代码。我不知道这个代码的目的是什么,但我怀疑它与555到565种颜色之间的切换有关。
我如何创建一个与上面的代码完全相反的函数?这会将变量转换回原始颜色编号吗?
答案 0 :(得分:3)
你做不到。 “和”(&
)和“或”(|
)没有反转(如果溢出则不会移位)。这意味着color
的多个值可能会转变为crap
。
答案 1 :(得分:2)
我怀疑它与555到565种颜色之间的切换有关。
是的,这就是它正在做的事情。 color
将是565表示,crap
将是相应的555表示。
让我们看一下每个操作的作用。我将这三个字段称为a
(5位),b
(6位,转换为5)和c
(5位)。
(color & 0xffc0)
清除该字的后6位,删除c
和b
的最低有效位,保留a
和b
的最重要的5位1}}。
>> 1
将这些位右移,因此我们现在有a
(5位),b
(5位)和一个空的5位字段。
(color & 0x1f)
清除除底部5位以外的所有位 - 也就是说,它保留'c'并删除其他字段。
最后,|
结合了两个值,左侧为a
和b
,右侧为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)
正在掩盖蓝色并将其添加回结果中。