繁体   English   中英

C - BitArray - 设置uint64_t的单个位

[英]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);
  }
}

我能以聪明的方式绕过这个演员吗? 我认为表演可能会受到每次读/写演员的影响......

<<运算符的结果类型是左操作数的类型(在整数提升之后),这就是您需要使用正确类型的原因: 1int类型,但您需要键入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_Cuint_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM