位域的设置和重置
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: 通过使用指向 a 和 mask 的指针,我如何完成函数位集。
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);
}
我正在尝试编写一个 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: 通过使用指向 a 和 mask 的指针,我如何完成函数位集。
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);
}