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