我目前正在从事一个需要使用位集的项目,我正在使用一个uint64_t
数组来表示位集。
我当前的问题是,每当我想要设置或检查一位时,我需要进行像这样的操作:
uint64_t index = 42;
bArr[index/64] |= (((uint64_t)1)<<(index%64));
我也可以通过一些聪明的与和位移操作重新编写除法和模运算,但我关心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
,以避免使用魔数。 - unwindconst uint64_t
表,其中包含 64 个不同的 ULL 常量(1 预先移位到所有可能的位置),并从中进行索引。 - tofro