簡體   English   中英

在C程序中解析32位整數

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

假設newPart2newPart3均為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.

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