位域的设置和重置

Set and Reset of Bitfields

我正在尝试编写一个 C 程序,其中我将声明两个类型为 status 位域的变量,status a 和 status mask.And in status a 我只能设置掩码中已经设置的位域

#include<stdio.h>

typedef struct
{
    unsigned int w : 1 ;
    unsigned int x : 1 ;
    unsigned int y : 1 ;
    unsigned int z : 1 ;
}status ;

void bitset(status* a,status* b,int position)
{
    /*Check for the position and set that bit only if it is set in mask.
     In this case, I can set only a.x and a.z.

}
int main()
{
    status a ;
    status mask ;
    int position ;

    mask.w = 0
    mask.x = 1 ;
    mask.y = 0;
    mask.z = 1;

    position = 1 ;

    bitset(&a,&b,position); 
}

为此我尝试使用 & operator.But 它显示错误。

Q1: 通过使用指向 amask 的指针,我如何完成函数位集。

Q2: 有没有办法让我一次设置所有的位域,比如 a = 0x10 以便仅设置 y 位。

Q3:有没有什么方法可以一次重置所有的位,比如a={0}。这是正确的方法吗?请帮忙。

A2:不可移植;您可以将它放入具有整数成员的 union 中,然后打乱位域,以便它适用于您的 ABI。但如前所述,这不可移植

A3:memset(&a, 0, sizeof a)应该做

但是:位域很难看,可能是您用例的错误选择。我会为此使用无符号整数。

A1:如果你想设置一个位,你应该使用 OR 运算符,而不是 AND。通过指针访问位类似于通过变量访问位。唯一的区别是“->”而不是“.”。 IE。 a->w 而不是 a.w;

A2:是的,有。例如,声明一个指向同一内存位置的整数指针,并使用它作为整数变量访问内存。请参阅下面的示例代码。缺点是您可以访问结构占用的所有位。

A3:同A2。能设置也能重置

#include <stdio.h>

typedef struct {
  int a:1;
  int b:1;
  int c:1;
  int d:1;
} bitField;

int main() {
  bitField A;
  bitField B;

  int *allA;
  allA = (int *)&A;     //Access bitField as Integer

  *allA = 0x02;         //Set bit 2 of A
  printf("A=0x%x\n", A);

  *allA = 0x53;         //Set bits 1 and 2 of A, but also set a few of "out of range" bits
  printf("A=0x%x\n", A);

  *allA = 0x01;         //Set bit 1, reset all other bits
  printf("A=0x%x\n", A);

  B.c = 1;              //Set Bit 3 of B

  A.c |= B.c;           //A=0b0001, B=0b0100 -> A|B=0b0101 (dec 5)
  printf("A=0x%x\n", A);

  int *allB;
  allB = (int *)&B;

  *allA = 0;
  *allB = 3;
  *allA |= *allB;       //Set bits 1 and 2 of A by OR-ing with B;
  printf("A=0x%x\n", A);
}