[英]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 -> 17
和00110 -> 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.