簡體   English   中英

如何獲取結構中任何成員的位位置

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

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