c++ - 如何有效地检查位掩码?

标签 c++ c bit bitmask

我正在使用 inotify 并希望有效地检查报告的位掩码事件(参见 inotify man page)。

现在我可以粗暴地检查每个事件的每一点,但如果不是愚蠢的话,那将是非常粗鲁的,因为我每次都会有 N 个条件。或者正在调用

( bitmask & mask ) == mask

对于每个 掩码已经 super 有效?

由于生成的位掩码基本上只是一个定义明确的数字,我应该能够为此使用基本的算术运算。但在我自己想出一些东西之前,我想问一下是否有一种众所周知的、有效的方法来检查给定的位掩码。那么,有吗?

最佳答案

如果你想检查一个位掩码,那么

if ((value & mask) == mask)

会给你一个精确匹配(“掩码中的所有位”),和

if ((value & mask) != 0)

将提供松散匹配(“掩码中的任何位”)。编译器将进一步优化针对零的检查。

如果您有多个位掩码,您希望从时域中的每个检查中提取最大信息(极端情况:如果您获得的所有值肯定都是奇数,则您不需要完全检查第 0 位。它将始终为 1)。理想情况下,您需要确定第一轮有 50% 概率为 1 的位。

然后在这两个组中,您以相同的机会确定一个子组(在这两种情况下可能不相同)。

if ((value & SPECIAL_MASK_1) == SPECIAL_MASK_1) {
    if ((value & SPECIAL_MASK_2) == SPECIAL_MASK_2) {
        ...
    } else {
        ...
    }
} else {
    if ((value & SPECIAL_MASK_3) == SPECIAL_MASK_3) {
        ...
    } else {
        ...
    }
}

如果您有 32 个状态,每个状态映射到一位,并且每次调用只能设置一位 - 最简单的情况 - “串行”序列将是 32 个检查中的一个接一个检查

if ((mask & 0x00000001) == 0x00000001) {
} else if ((mask & 0x00000002) == 0x00000002) {
}
...

第一个简单的优化是首先检查最频繁出现的情况。假设设置了三分之一的第七位;你先检查第七位。

这样,您最终将有 33% 的时间只做一次检查;然后也许另外 20% 的时间进行两次检查,......,最后平均你可能会运行,比如说,七次检查。

另一种可能是

if (mask & 0x0000FFFF) {
    // The bit is in the LSW
    if (mask & 0x0000FF00) {
        // MSB of LSW
        if (mask & 0x0000F000) {
            ...
        } else {
        }
    }
} else {
}

这将每次恰好运行五次检查。然而,到那时,对 CPU 架构、分支预测等的考虑可能会胜过您可能尝试进行的任何优化。

除非你有一个非常复杂的设置,或一些其他限制(例如嵌入式设备),否则我担心分析、构建、调试和维护“优化​​”与“蛮力”的成本check 可能不仅仅是平衡你可以从前者中挤出的任何优势。

关于c++ - 如何有效地检查位掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28877815/

相关文章:

c++ - 在不更改代码的情况下使用 .in 文件进行测试

c++ - 使用模板类专门化模板函数

c - access() 有什么问题?

c - Azure IoT - 重置和清除设备孪生

java - BitSet valueOf 的作用是什么?

c - 二进制数的反转函数

c++ - glDrawArrays 与 cocos2d 根本不绘制

c++ - 使用 curl 的 mobotix 相机

c - 水库采样算法不起作用

c - 将 32 位寄存器拆分为可变大小字节