[英]C - BitArray - Set single bit of uint64_t
我正在开发一个项目,我需要一些项目。 我正在使用uint64_t
的数组作为bitset。
我目前的问题是,无论何时我想设置或检查一下,我都需要做这样的操作:
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);
}
}
我能以聪明的方式绕过这个演员吗? 我认为表演可能会受到每次读/写演员的影响......
<<
运算符的结果类型是左操作数的类型(在整数提升之后),这就是您需要使用正确类型的原因: 1
是int
类型,但您需要键入uint64_t
。
你可以使用:
(uint64_t) 1
要么
UINT64_C(1) /* you have to include <stdint.h> */
要么
1ULL
(对于最后一个假设unsigned long long
在您的系统中是64位很可能)。
但它们都是等价的:所有这些表达式都是整型常量表达式,它们的值是在编译时计算的,而不是在运行时计算的。
演员本身并不影响演出。 它是一个编译时构造,它告诉编译器表达式的类型。
在这种情况下,它们都是整数转换和表达式,因此不应对性能产生影响。
C为此提供宏,它将整数常量扩展为int_leastN_t
类型。
INTN_C(value)
UINTN_C(value)
例
#include <stdint.h>.
bArr[index/64] |= UINT64_C(1) << (index%64);
一般来说 ,最好避免铸造。 有时铸造意外地使表达比希望的更窄 。
UINT64_C
: uint_least_64_t/int_least_64_t
类型必须存在(C99)。 int64_t/uint64_t
是可选的。
如果我理解正确,你需要一个至少64位长的文字1。 你可以通过写1ull
而不是1
来获得这个而不需要任何强制转换。 这将创建一个值为1的unsigned long long
文字。但是,不保证类型不会超过64位,所以如果你依赖它只是64位,你可能需要一个强制转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.