簡體   English   中英

分隔位域中的位

[英]Separating bits in a bitfield

假設我有一個位域結構:

typedef struct{
   unsigned int a:2;
   unsigned int b:4;
   unsigned int c:4;
}bf1

假設我已經設置了這樣的位:

bf1.a=2;
bf1.b=9;
bf1.c=8;

現在,我想將位域分成 5 和 5 兩部分。
如果位當前看起來像這樣1000100110
我想把它分成10001 -> 1700110 -> 6

由編譯器決定位字段中字段的順序。

單元內位域的分配順序(高位到低位或低位到高位)是實現定義的。

因此,除非您針對特定的編譯器和平台,否則使用位字段無法實現您想要實現的目標。 (如果順序是可預測的,您將使用位域的聯合。)

因此,您將需要手動執行位操作。

unsigned bf =
     ( 8 << 8 )
   | ( 9 << 4 )
   | ( 2 << 0 );

unsigned x = ( bf >> 5 ) & 0x1F;  // `& MASK` not needed for most significant field.
unsigned y = ( bf >> 0 ) & 0x1F;

或者

unsigned bf = 0;

bf = ( bf & ~0x3C0 ) | ( 8 << 8 );
bf = ( bf & ~0x03C ) | ( 9 << 4 );
bf = ( bf & ~0x003 ) | ( 2 << 0 );

unsigned x = ( bf >> 5 ) & 0x1F;  // `& MASK` not needed for most significant field.
unsigned y = ( bf >> 0 ) & 0x1F;

即使該字段以前不是零,第二個版本也可以工作。

當然,這段代碼可以使用定義和函數來清理。 有關示例,請參見前面問題的答案

暫無
暫無

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

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