c++ - 为什么在 C++ 中使用按位运算

标签 c++ bitwise-operators

我很难理解为什么在枚举中使用按位运算 然后在代码中。 为什么不只使用数字或 bool 值 例如:

enum
{
    RS_BLEND = (1 << 0),
    RS_BLEND_FUNC = (1 << 1),
    RS_CULL_FACE = (1 << 2),
    RS_DEPTH_TEST = (1 << 3),
    RS_DEPTH_WRITE = (1 << 4),
    RS_DEPTH_FUNC = (1 << 5),
    RS_CULL_FACE_SIDE = (1 << 6),
//            RS_STENCIL_TEST = (1 << 7),
//            RS_STENCIL_WRITE = (1 << 8),
//            RS_STENCIL_FUNC = (1 << 9),
//            RS_STENCIL_OP = (1 << 10),
    RS_FRONT_FACE = (1 << 11),

    RS_ALL_ONES = 0xFFFFFFFF,
};


void RenderState::StateBlock::setCullFace(bool enabled)
{
    _cullFaceEnabled = enabled;
    if (!enabled)
    {
        _bits &= ~RS_CULL_FACE;
    }
    else
    {
        _bits |= RS_CULL_FACE;
    }
}

这不是关键软件或嵌入式软件。

最佳答案

使用位而不是 bool 值的优点是您可以直接操作值集。例如定义:

const int FILLED  = (1 << 0);
const int STROKED = (1 << 1);
const int SHADOW  = (1 << 2);
const int BLINK   = (1 << 3);

你可以让一个函数接受draw_mode参数并像这样调用它

draw_symbol(FILLED | SHADOW | BLINK, "X");

即直接传递值的子集。

使用容器而不是单个整数参数将需要更多代码来编写和读取。它的效率也会较低,但在某些情况下这不是最重要的一点。

关于c++ - 为什么在 C++ 中使用按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33840843/

相关文章:

c++ - 是否有一个 c++ 库可以在跨平台应用程序中包含 flash 视频?

java - 为什么 base64 编码 java 代码这样做

Java:检查长整型中是否设置了特定位

c++ - 创建对象时如何初始化数组?

c - 寻找新位的优化方法

C# - 使用哪种数据结构 - 以 180 位操作和存储国际象棋位置?

php - 对 bool 数组执行按位运算

c++ - 删除不需要的字符

c++ - 匹配 CRTP 类的固定大小数组

c++ - 防止某人意外地做某事