2

ビットフィールドを理解するためにいくつかの経験をする

こんにちは、このコードがあります:

01  #include <stdio.h>
02  #include <stdlib.h>
03
04  void AddToBitfield(int *bitfield, int bitCount, int value);
05  int ReadFromBitfield(int *bitfield, int bitCount);
06
07  int main(){
08      /*Device list (0 Modem,1 Keyboard,2 Mouse,3 Speakers,4 Joystick,5 Flash Drive,6 Scanner,7 Printer,8 Microphone,9 Webcam,10 Monitor)*/
09      int device=0,memLoc=0,data=0;
10      int number = 0;
11
12      memLoc = 01; /*put 01 or 10*/
13      device = 15; /*Device id*/
14      data = 12343; /*Data to store - Only less or equal then 65535*/
15
16      AddToBitfield(&number,4,device);
17      AddToBitfield(&number,16,data);
18      AddToBitfield(&number,2,memLoc);
19
20      printf("--%d---\n",number);
21
22      printf("Memory location: %d\n",ReadFromBitfield(&number,2));
23      printf("Data stored: %d\n",ReadFromBitfield(&number,16));
24      printf("Device: %d\n",ReadFromBitfield(&number,4));
25
26      return 0;
27  }
28
29  void AddToBitfield(int *bitfield, int bitCount, int value){
30      *bitfield <<= bitCount;
31      *bitfield |= value;
32  }
33
34  int ReadFromBitfield(int *bitfield, int bitCount){
35      int value = *bitfield & ((1 << bitCount) - 1);
36      *bitfield >>= bitCount;
37
38      return value;
39  }

またはprintfdata = 12343;と一緒に and を使用すると、期待どおりにすべてが表示されます。memLoc = 01;memLoc = 10;

data = 12346;と を一緒に使用する、memLoc = 01;またはmemLoc = 10;同じものを使用する。printf はすべて期待どおりに表示されます。

しかし、私が使用する場合、data = 12344;または印刷data = 12345;を使用memLoc = 01;する場合は、両方のケースで期待されるものが表示されますmemLoc = 10;が、最初のケースで使用するData stored: 12346と、2番目のケースで印刷されData stored: 12347ます。

なぜこうなった?

4

1 に答える 1

2

この Cstructを使用して、ビット フィールドの読み取り/書き込みを行うことができます。

struct MyType
{
    uint16_t memLoc:4;
    uint16_t device:4;
    uint16_t _reserved:8;
    uint16_t data;
};

コードは次のようになります。

int main()
{
    // ...

    struct MyType number;
    uint32_t numberInt;

    number.memLoc = 1;
    number.device = 15;
    number.data = 12343;

    memcpy(&numberInt, &number, sizeof(struct MyType));
    printf("--%d---\n", numberInt);

    printf("Memory location: %d\n", number.memLoc);
    printf("Data stored: %d\n", number.data);
    printf("Device: %d\n", number.device);

    // ...
}

各フィールドのビット数を教えてください。その構造を修正します。

ビット フィールドに関する記事は次のとおりです: http://en.wikipedia.org/wiki/Bit_field

于 2012-04-22T17:46:06.633 に答える