移回某物
Shifting back to something
word color;
crap = ((color & 0xffc0) >> 1) | (color & 0x1f)
我有这个移动代码。我不知道这段代码的目的是什么,但我怀疑它与在555到565种颜色之间切换有关。
我如何创建一个与上面的代码完全相反的函数?将变量转换回原来的颜色数?
你不能。"answers"(&
)和"或"(|
)没有逆(如果溢出也没有位移位)。这意味着可能有多个color
值可以变成crap
我怀疑这与在555到565种颜色之间切换有关。
是的,它就是这么做的。color
为565表示,crap
为相应的555表示。
让我们看看每个操作的作用。我将把这三个字段称为a
(5位),b
(6位,转换为5位)和c
(5位)。
(color & 0xffc0)
清除字的底部6位,去掉c
和b
的最低有效位,保留a
和b
的最高有效位。
>> 1
将这些位右移,所以我们现在有a
(5位),b
(5位)和一个空的5位字段。
(color & 0x1f)
清除除底部5位以外的所有位-也就是说,它保留'c'并删除其他字段。
最后,|
结合了这两个值,左边是a
和b
,右边是c
,每个值都是5位。
我如何创建一个与上面的代码完全相反的函数?将变量转换回原来的颜色数?
color = ((crap & 0xffe0) << 1) | (crap & 0x1f);
注意b
的最低有效位现在是零,不管它开始是什么。该信息在第一次转换中丢失,并且无法恢复。
严格地说,你不能,因为转换不可逆地删除了color
的第五个最低有效位(它保留了所有其他位)。
假设第5位开始不包含任何有用的数据,下面的代码将为您提供转换的逆:
color = ((crap & 0xffe0) << 1 | (crap & 0x1f))
再次,这将恢复color
,但第5位已经丢失。
是的,这看起来像是通过忽略g的最低位将565 RGB转换为555 RGB。
你失去了一个比特,所以你不能完全反转它(G的最低位消失了),但是你可以通过这样做来近似逆:
color = ((crap & 0xffe0) << 1) | (crap & 0x1f)
第一部分,((crap & 0xffe0) << 1)
只是掩盖了R和G分量并将它们移回来。最后一部分,| (crap & 0x1f)
,是屏蔽蓝色,并将其添加回结果。
- 没有找到相关文章