![](/img/trans.png)
[英]Implicit typecasting in C (Converting 32 bit unsigned in to 8 bit u 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.