簡體   English   中英

在c中構造32位unsigned int

[英]constructing 32 bit unsigned int in c

我試圖使用unsigned int構造一個32位二進制值。 這就是32位被分成幾部分的方式

第1部分= 4位

第2部分= 2位

第3部分= 12位

第4部分= 2位

第5部分= 12位

如何使用這些部件來構造32位二進制值(unsigned int)使用位移可以有人請求幫助

(不能只是移位...如果我想更新某些部分怎么辦?)

您只需按照建議使用移位:

uint32_t x = (part1 << 28)
           | (part2 << 26)
           | (part3 << 14)
           | (part4 << 12)
           | (part5);

看起來你想要這個值:

part5 + (part4 << 12) + (part3 << 14) + (part2 << 26) + (part1 << 28)

(確保所有五個變量都是uint32_t類型或類似的。)

這是典型的位移/位屏蔽功能。 以下是設置初始值的方法:

uint32_t value = ((part1 & 0xF) << 28)
                 | ((part2 & 0x3) << 26)
                 | ((part3 & 0xFFF) << 14)
                 | ((part4 & 0x3) << 12)
                 | (part5 & 0xFFF);

每一行使用按位AND (&)清除每個部分的高位,因此它不會在最終值內溢出其分配的位寬。 例如,如果part4是0xFF並且你忘記了& 0x3那么part4(0xFC)的高6位將溢出到part3的區域。 然后將零件移位(<<)到其最終位置,並與其余零件按位或(|)

一些開發人員通過位域完成同樣的事情,但由於潛在的可移植性問題,我不推薦這種方法。

到目前為止,大多數(全部?)其他答案都忘記了解決方案的按位AND部分。 如果零件值超過指定的位寬,他們的答案將導致錯誤。

如果要更新值的特定部分,則需要通過按位AND和按位OR進行更多位掩碼。 例如,要更新第4部分,您需要執行以下操作:

value &= ~(0x3 << 12);  /* Clear the part4 region */
value |= (part4 & 0x3) << 12;    /* Set the part4 region to the new value */

如果你是C中的新工作,那么第一行有點棘手。它表示取0x3並將其移位12(結果= 0x00003000),執行按位補碼(結果= 0xFFFFCFFF),並設置值等於自身按位 - 結果。 這就是你清除值的part4區域的方法......因為你是按位並且該區域為零,結果是該區域現在為零。

第二行將歸零的part4區域設置為新值,就像我們在設置初始值時所做的那樣。

暫無
暫無

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

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