[英]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.