在手写的地方使用 bitset 是否有任何性能损失/增益?
如何在运行时使用 bitset 构建以下内容
- 将 2 到 5 之间的所有位设为零,即
11110011
.
在手写的地方使用 bitset 是否有任何性能损失/增益?
如何在运行时使用 bitset 构建以下内容
11110011
.黄金法则:
不要过早优化!
在 99% 的情况下,Bitset足够快,并且具有作为一个通用概念的优势,因此它既更具可读性,又不易出现实现错误。不要简单地假设您的代码显然需要提高速度;使用 bitset 编写代码,分析您的应用程序,并查看是否:
根据 80-20 规则,您可能会在更快地编写其他代码时获得更大的回报。嘿,如果事实证明您确实需要提高比特旋转速度,至少您有一些不错的基线数据可以使用,以表明您的解决方案确实比默认解决方案更快(无论如何您都需要)如果您想优化性能)。
您的第二个问题最简单的解决方案是使用另一个位集。
void makebitszero(bitset<8>& b) {
// Everything but bits 3 and 4 (between 2 and 5).
static const bitset<8> mask = ~bitset<8>(12);
b &= mask;
}
mask
为给定的两个位位置提出一个表达式需要一些数学知识。
[编辑] 好的,这是数学。诀窍是这(1UL << X) -1
是一个序列X
。例如 3 => 00000111。因此,(1<<5) - (1<<3) = 00011111 - 00000111 -1 + 1 = 00011000(位 3 和 4)。因此在代码中:
template<int i, int j, int N>
void makeBitsZero(bitset<N>& b) {
// Everything from bit i up to but not including bit j (i < j)
static const bitset<N> mask = ~bitset<N>(1UL<<j) - (1UL<<i));
b &= mask;
}
对于像上面这样的简单示例,一个体面的手动编码解决方案将比使用 bitset 更快,但两种情况下的性能差异都会很小。