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 是否包含在集合中,只要查看 表示
例如,可将具有 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 来判断。