首页 > 解决方案 > 在 C++ 中更改部分位?

问题描述

我已将 rgba 值的数据打包成 16 位短,因此对于每个通道为 4 位,我如何才能仅更改特定通道,假设我想将红色通道更改为除以 2 的值。我知道如何更改 int 中的特定位,但一点一点地更改会非常缓慢且令人厌烦。

所以在代码中,我首先保存 RGBA 值:

RGBA = R | (G << 4) | (B << 8) | (A << 12)

然后我想将 RGBA 短路的“A”部分更改为 A / 2。

标签: c++bit-manipulationshort

解决方案


如果您不关心位的顺序(例如,不需要将其用于序列化目的),那么这是位域的一个很好的用例。例子:

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 的情况下进行屏蔽,因为它将为零,但您确实需要它让所有其他人屏蔽更高位。


推荐阅读