移回某物

Shifting back to something

本文关键字:      更新时间:2023-10-16
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位,去掉cb的最低有效位,保留ab的最高有效位。

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

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

最后,|结合了这两个值,左边是ab,右边是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),是屏蔽蓝色,并将其添加回结果。

相关文章:
  • 没有找到相关文章