我正在尝试编写一个C程序,其中我将声明两个类型状态位域变量,状态a和状态掩码。并且在状态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);
}
为此,我尝试使用&amp; operator.But它显示错误。
Q1:通过使用指向 a 和掩码的指针,如何完成功能位集。
Q2:有没有办法让我可以一次设置所有的位域,就像这样 a = 0x10,因此只设置y位。
问题3:有没有办法可以一次重置所有位,比如a = {0}。这是正确的方法吗?请帮忙。
答案 0 :(得分:1)
A2:不是以便携方式;你可以把它放到一个带有整数成员的union
中,然后对位域进行洗牌,使它适用于你的ABI。但如上所述,这不是便携式的
A3:memset(&a, 0, sizeof a)
应该这样做
但是:位域很难看,可能是你用例的错误选择。我会使用无符号整数。
答案 1 :(得分:0)
A1:如果你想设置一个位,你应该使用OR运算符,而不是AND。通过指针访问位类似于via via变量。唯一的区别在于“ - &gt;”代替 ”。”。即a-&gt; w而不是a.w;
A2:是的,有。例如,声明一个指向同一内存位置的整数指针,并使用它作为整数变量访问内存。请参阅下面的示例代码缺点是您可以访问结构占据的所有位。A3:与A2相同。如果你可以设置,你也可以重置。
df.set_index('Gene_Symbol').stack()[lambda x: x != 0].unstack(level=1).reset_index()
# Gene_Symbol Case1 Case2 Case3
#0 GAPDHS;TMEM147 0.532672 0.541698 0.482159