位运算应用及其注意事项

1. 可能发生的溢出

  • 使用 64 位整数时发生的溢出。试编写代码,使其能够确认无符号的 64 位整数的位掩码(bitmask)a 的第 b 位(从右向左数)是否已经打开。

    bool isBitSet(unsigned long long a, int b) {
        return a & (1 << b) > 0; 
    }

    注意,在 C++ 中,1 会定义为有符号的 32 位整数,当 b 超过 32 时,(1<

2. 使用位掩码实现集合及其操作

集合的操作是位掩码的最重要的应用范围。这种应用中,N 位整数,可以拥有 0 到 N-1 个整数元素的集合。要判断某个元素 i 是否包含在集合中,只要查看 表示 2i 的位是否打开即可。

例如,可将具有 6 个元素的集合 {1, 4, 5, 6, 7, 9} 的整数 754 表示如下:

  • 2^1+2^4+2^5+2^6+2^7+2^9 = 754

如我们需要判断 7 这个元素是否在集合中,则可通过,(1 << 7) & 754 的结果是否大于 0 来判断。

原文地址:https://www.cnblogs.com/mtcnn/p/9423319.html