改变部分位在一个短在c++ ?



我已经打包了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;

最新更新