[英]Parsing 32 bit integer in C program
我有一個32位整數,分成如下部分:
--------------------------------------
| Part1 | Part2 | Part 3 |
--------------------------------------
第1部分高16位。 (第2部分+第3部分)=低16位。
第2部分是10位,第3部分是6位
我需要有關如何閱讀和更新C程序的第1部分,第2部分和第3部分的幫助。
給定具有上述格式的整數x
,您可以像這樣替換Part2:
x = (x & ~(0x3ff << 6)) | (newPart2 << 6);
和Part3像這樣:
x = (x & ~0x3f) | newPart3;
假設newPart2
和newPart3
均為unsigned int
且其新值已正確調整。
int i
提取各個部分
part1 = (i & 0xFFFF0000) >> 16
part2 = (i & 0x0000FFC0) >> 6
part3 = (i & 0x0000003F)
組成整數
i = (part1 << 16) | (part2 << 6) | (part3)
嘗試強制轉換為此結構
struct {
uint32_t part_1:16;
uint32_t part_2:10;
uint32_t part_3:6;
} parts;
可能是以下一種,具體取決於字節序
struct {
uint32_t part_1:6;
uint32_t part_2:10;
uint32_t part_3:16;
} parts;
顯然不便攜!
由於您需要閱讀和更新,因此可以使用指針。 例如,如果您的32位值稱為x,則執行以下操作
parts *ptr = (parts *)&x;
ptr->part_2 = <part2 update>
在此后面要使用的理論是和,或與掩碼的移位操作。
要訪問整數的某些位,請首先創建一個掩碼,在其中要使用的位中有一個。 現在在掩碼和整數之間應用and and
( &
)操作。 根據&
的行為,掩碼為0的位將為0,掩碼為1的位將具有整數形式的該位的值。 現在我們只有我們想要的位,我們將它們向右對齊,這是通過將位向右移正確的位置數來完成的,以便將掩碼的最右邊的位保留在字節的較低有效位置。
要寫入字節的一部分,我們需要用拳頭使該部分中的內容無效,因為我們使用了用於讀取該部分的否定掩碼。 取反該部分后,我們將對必須與該位置對齊的新值應用“ or
( |
)操作。
讀書:
unsigned int read_part_1(unsigned int composed) {
return (composed & 0xffff0000) >> 16;
}
unsigned int read_part_2(unsigned int composed) {
return (composed & 0x0000ffc0) >> 6;
}
unsigned int read_part_3(unsigned int composed) {
return (composed & 0x0000003f);
}
要寫(val右對齊):
unsigned int write_part_1(unsigned int composed, unsigned int val) {
return (composed & ~0xffff0000) | ((val & 0x0000ffff) << 16);
}
unsigned int write_part_2(unsigned int composed, unsigned int val) {
return (composed & ~0x0000ffc0) | ((val & 0x000003ff) << 10);
}
unsigned int write_part_3(unsigned int composed, unsigned int val) {
return (composed & ~0x0000003f) | (val & 0x0000003f);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.