c++ - 在 C++ 中更改部分位?
问题描述
我已将 rgba 值的数据打包成 16 位短,因此对于每个通道为 4 位,我如何才能仅更改特定通道,假设我想将红色通道更改为除以 2 的值。我知道如何更改 int 中的特定位,但一点一点地更改会非常缓慢且令人厌烦。
所以在代码中,我首先保存 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 的情况下进行屏蔽,因为它将为零,但您确实需要它让所有其他人屏蔽更高位。
推荐阅读
- php - 如何在数据库mysql选择范围内设置数量
- r - 如何将向量添加到R中矩阵的每一列?
- payment-processing - 向餐厅网站添加在线订购功能
- julia - 如何在 Julia 中正确地将数组作为参数?
- python - 执行 convLSTM2D() 时出现错误“函数调用堆栈:train_function”
- javascript - 通过 id 从 Firestore 中删除文档,而不对特定 id 进行硬编码
- python - 如何增加箭袋图的箭头大小并更改比例以描述幅度而不是箭头?
- php - 导出到 php 中的 excel 后有什么方法可以获取网格线?
- javascript - 使用 usePDF 挂钩时 react-pdf 库出现问题
- reactjs - 选择复选框并显示行 - React js