簡體   English   中英

C 為特定數字設置 3 位

[英]C set 3 bits for a particular number

我想了解掩碼概念,並想在 C 中設置 uint32_t 數字的位 24,25,26。

我有的例子

uint32_t 數據 =0;

我正在接受 uint_8 用戶的輸入,它只能是值 3 和 4 (011,100)

我想在不干擾其他位的情況下在數據變量的位 24、25、26 中設置值 011 或 110。

謝謝。

要設置整數的第 24、25 和 26 位而不修改其他位,可以使用以下模式:

data = (data & ~((uint32_t)7 << 24)) | ((uint32_t)(newBitValues & 7) << 24);

第一個&操作清除這三個位。 然后我們使用另一個&操作來確保我們有一個介於 0 和 7 之間的數字。然后我們將它向左移動 24 位並使用| 將這些位放入最終結果中。

我有一些uint32_t轉換只是為了確保此代碼在int少於 32 位的系統上正常工作,但除非您正在對嵌入式系統進行編程,否則您可能不需要這些。

更通用的方法宏和函數。 兩者都與優化編譯器做得非常好一樣有效。 宏將位置s處的d n位設置為nd 函數具有相同的參數順序。

#define MASK(n)   ((1ULL << n) - 1)
#define SMASK(n,s) (~(MASK(n) << s))
#define NEWDATA(d,n,s) (((d) & MASK(n)) << s)
#define SETBITS(d,nd,n,s) (((d) & SMASK(n,s)) | NEWDATA(nd,n,s))

uint32_t setBits(uint32_t data, uint32_t newBitValues, unsigned startbit, unsigned nbits)
{
    uint32_t mask = (1UL << nbits) - 1;
    uint32_t smask = ~(mask << startbit);
    data = (data & smask) | ((newBitValues & mask) << startbit);
    return data;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM