【发布时间】:2016-10-31 07:03:23
【问题描述】:
我目前正在做一个项目,我需要位组。我正在使用 uint64_t 的数组作为 bitset。
我目前的问题是,每当我想设置或检查一点时,我都需要做这样的操作:
uint64_t index = 42;
bArr[index/64] |= (((uint64_t)1)<<(index%64));
我也可以用一些巧妙的 and 和 bitshift 操作重写除法和取模,但我担心1 的演员阵容。我需要这个演员表,否则 1 被视为 32 位单元。正如在这个例子中看到的 - 你得到错误的输出没有演员:
uint64_t bArr[4]; // 256 bits
bArr[0] = bArr[1] = bArr[2] = bArr[3] = 0; // Set to 0
uint64_t i = 255;
bArr[i/64] = (bArr[i/64] | (((uint64_t)1)<<(i%64)));
uint32_t i2;
for (i2 = 0; i2 < 256; i2++) {
if ((bArr[i2/64] & (((uint64_t)1)<<(i2%64))) != 0) {
printf("bArray[%" PRIu32 "] = 1\n", i2);
}
}
我可以巧妙地绕过这个演员阵容吗?我在想,性能可能会受到每个读/写时的演员阵容的影响......
【问题讨论】:
-
不要不将除法和取模重写为“聪明”;编译器当然足够聪明,已经为您进行了这些优化。还可以考虑使用
CHAR_BIT * sizeof bArr[0]而不是64,以避免出现幻数。 -
@unwind 感谢您的提示。我会用我的代码测试它。不过,情况可能就是这样。
-
如果您正在寻找速度,请提供一个
const uint64_t表,其中包含 64 个不同的 ULL 常量(1 个预先移动到所有可能的位置)并对其进行索引。
标签: c casting bit-shift memory-efficient bitarray