设置和重置位域

时间:2017-05-17 20:05:33

标签: c bits bit-fields

我正在尝试编写一个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}。这是正确的方法吗?请帮忙。

2 个答案:

答案 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