簡體   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