如何使用逐位运算实现位向量
How to implement bit vectors with bitwise operations?
我正在研究《编程珍珠》一书中的一个问题,他们建议用这个函数来设置位向量中的一位。我对它的作用有点困惑。
#define BITSPERWORD 32
#define MASK 0x1F
#define SHIFT 5
#define N 1000000
int a[1 + N/BITSPERWORD];
void set(int i){
a[i >> SHIFT] |= (1 << (i & MASK));
}
以下是我对该代码的(可能是错误的)解释。如果i=64,
1) 首先,它取i
并将其向右移位SHIFT(即5)位。这相当于DIVIDING(不是像我最初想的那样)i
乘以2^5
。因此,如果i
是64
,则a的索引是2
(64 / 2^5)
2) a[2] |= (1 << (64 & MASK))
64 & 1 = 1000000 & 01 = 1000001
所以1被左移了多少位????
- 这个方法似乎是如何工作的,尽管我觉得有更好的方法可以设置一点。是为了找到
ith
比特的索引,它本质上除以32,因为这是每个字的比特数 - 由于此处使用的运算符是
|
,因此功能是将位设置为1,而不是切换位 - 0x1F实际上是31,当与i相加时,得到余数(不确定他们为什么不使用
%
) - 最后,移位将1带到正确的位置,或者它与向量中的右槽对齐
如果您计划使用此代码
- 你可以在没有定义的情况下写得很清楚,使用更明显的方法,我怀疑这会在速度上有所不同
- 此外,您可能只应该使用
std::bitset
- 使用掩码来获取剩余值特别让我恼火,因为我很确定它不一定对每个数字都有效,31恰好有效,因为它都是1
相关文章:
- 为共享 ptr 向量实现复制 c'tor?
- C++:实现向量和矩阵类的最佳结构
- 使用向量在 c++ 中合并排序实现
- 为什么在此排序算法实现中,向量明显比数组慢?
- priority_queue使用降序向量实现最小堆的语法差异
- 布尔向量实现
- 如何有效地实现将向量的数据分配给多个变量?
- Push_back一组(异构)向量的实现
- 如何实现使用 gcc-4.4 编译的大向量初始化?
- 实现一个想要模拟 std::string 但在将其push_back向量时卡住的类
- C++ 使用向量实现合并排序
- C++ 入门 12.1:我可以在类中使用静态向量成员实现 StrBlob<string> 吗?
- 如何为向量实现 std::erase ?
- 字符串和向量的shrink_to_fit实现不同?
- 我如何实现向量重新分配
- 实现向量的push_back()函数会导致意外输出
- BAD_ALLOC错误实现向量调整大小函数时
- 在队列中实现向量
- 为什么我不能在类和函数中实现向量C++执行此代码?
- 实现向量的向量