我已经打包了rgba值的数据在16位短,所以对于每个通道去4位,我怎么能只改变特定的通道,让我说我想改变红色通道的值除以2。我知道如何在整型中更改特定的位,但是逐位更改将非常缓慢且令人厌烦。
所以在代码中首先我保存RGBA值在一个简短的:
RGBA = R | (G << 4) | (B << 8) | (A << 12)
然后我想将RGBA短的'A'部分更改为A/2。
如果您不关心位的顺序(例如,不需要序列化),那么这是位字段的一个很好的用例。例子:
struct RGBA {
std::uint16_t r : 4;
std::uint16_t g : 4;
std::uint16_t b : 4;
std::uint16_t a : 4;
};
RGBA rgba = {r, g, b, a};
a = rgba.a; // read a from rgba
如果你确实需要有一个std::uint16_t,其中的位按特定顺序排列,那么你可以使用按位操作符来代替。
所以在代码中首先我保存RGBA值在短:
RGBA = R | (G << 4) | (B << 8) | (A << 12)
然后我想'A'部分的RGBA短
:
A = (RGBA >> 12) && 0xF;
在A的情况下,你技术上不需要屏蔽,因为它将是0,但你确实需要它来掩盖所有其他的高比特。
对不起,我不清楚我在问什么,我明白了,我只需要从RGBA获得一个值,正如erorika所说,并将其保存到另一个名为Aval
的短:
unsigned short Aval = RGBA >> 12;
则将RGBA的A部分重置为0,因此:
RGBA &= (0xF << 12);
然后将Aval更改为您想要的任何内容,然后将其保存到RGBA short的A部分:
RGBA |= Aval << 12;