[英]How to get the bit position of any member in structure
如何獲得結構中任何成員的位位置?
在示例>
typedef struct BitExamStruct_
{
unsigned int v1: 3;
unsigned int v2: 4;
unsigned int v3: 5;
unsigned int v4: 6;
} BitExamStruct;
是否有任何宏來獲取諸如GetBitPos(v2,BitExamStruct)之類的任何成員的位位置?
我以為編譯器可能會根據結構中的位長知道成員的位置。 因此,我想知道是否可以通過僅使用一個簡單的宏而不運行代碼來獲取它。
先感謝您。
我沒有知道這樣做的標准方法,但這並不意味着您找不到解決方案。
以下不是有史以來最漂亮的代碼; 識別變量在內存中“開始”的位置是一種黑客。 請記住,根據字節序,以下內容可能會給出不同的結果:
#include <stdio.h>
#include <string.h>
typedef struct s_toto
{
int a:2;
int b:3;
int c:3;
} t_toto;
int
main()
{
t_toto toto;
unsigned char *c;
int bytes;
int bits;
memset(&toto, 0, sizeof(t_toto));
toto.c = 1;
c = (unsigned char *)&toto;
for (bytes = 0; bytes < (int)sizeof(t_toto); bytes++)
{
if (*c)
break;
}
for (bits = 0; bits < 8; bits++)
{
if (*c & 0b10000000)
break;
*c = (*c << 1);
}
printf("position (bytes=%d, bits=%d): %d\n", bytes, bits, (bytes * 8) + bits);
return 0;
}
我要做的是將整個結構初始化為0,並將1設置為要定位的變量的值。 結果是結構中只有一位被設置為1。 然后,我逐字節讀取內存字節,直到找到一個不為零的字節。 一旦找到,就可以查看其位,直到找到已設置的位。
沒有可移植(又稱為標准C)方式。 但是,跳出框框思考,如果您需要完全控制或急需此信息,則位域是錯誤的方法。 正確的解決方案是移動和屏蔽。 當然,這僅在您控制源代碼時才可行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.