标签: bit-fields

C++ bool数组为bitfield?

假设我需要在结构中存储8个bool,但是我想一起使用它们只有1个字节,那么我可以这样做:

struct myStruct {
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
};
Run Code Online (Sandbox Code Playgroud)

有了这个我可以做的事情

myStruct asdf;
asdf.b3=true;
asdf.b4=false;
if(asdf.b1)
    ...
Run Code Online (Sandbox Code Playgroud)

到目前为止这是正确的吗?(我实际上并不知道,我之前从未使用过bitfields)

好的 - 但是也可以创建一个8个bool的静态数组,这样它们只能使用8位但是我仍然可以通过索引来加入它们吗?

就像是

struct myStruct {
public:
    bool b[8]:8;
};
Run Code Online (Sandbox Code Playgroud)

也许?(有了这个,我得到一个错误C2033)

谢谢您的帮助!

c++ struct boolean bit-fields

4
推荐指数
1
解决办法
6688
查看次数

位域的概念

struct A
{
 int a:2;
 int b:3;
 int c:3;
};

int main()
{
 struct A p = {2,6,1};
 printf("\n%d\n%d\n%d\n",p.a,p.b,p.c);
 return 0;
}    
Run Code Online (Sandbox Code Playgroud)

输出为:-2,-2,1

在C complier和C++编译器中输出上述代码的内容是什么?为什么?

c bit-fields

4
推荐指数
1
解决办法
1028
查看次数

压缩结构的大小,在C中具有小于8位的位字段的并集

在C中是否可以将以下结构的大小设为2?

#include <stdio.h>

struct union_struct {
    char foo;
    char bar : 2;
    union {
        char foobar1 : 6;
        char foobar2 : 6;
    };
};

int main(void)
{
    printf("size of union struct: %d\n", sizeof(struct union_struct));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出,用gcc编译:

size of union struct: 3

c sizeof packed bit-fields

4
推荐指数
1
解决办法
1192
查看次数

C中的逐位结构编程

这是如何运作的?

struct {
    int a : 21;
    int b : 11;
};
Run Code Online (Sandbox Code Playgroud)

a和b是两个单独的int变量还是使用不同位域的相同变量?

c bit-fields

4
推荐指数
1
解决办法
1749
查看次数

你可以用带有位域的C结构创建一个NSValue吗?

我正在尝试执行以下操作,但是NSValue创建方法会返回nil.结构中的C位域是否不受支持?

struct MyThingType {
    BOOL isActive:1;
    uint count:7;
} myThing = {
    .isActive = YES,
    .count = 3,
};

NSValue *value = [NSValue valueWithBytes:&myThing objCType:@encode(struct MyThingType)];
// value is nil here
Run Code Online (Sandbox Code Playgroud)

c cocoa objective-c objective-c-runtime bit-fields

4
推荐指数
1
解决办法
364
查看次数

Python ctype-bitfields:获取位域位置

我创建了一个带有相应Union的ctype位域结构,通过单个位域和整数值来访问它.我能够使用包含字段名称的变量设置单个字段,但现在我想知道特定字段属于哪个字节.这是我的代码示例:

import ctypes

c_short = ctypes.c_uint16

class Flags_bits(ctypes.LittleEndianStructure):
    _fields_ = [
        ("bitField1", c_short, 1),
        ("bitField2", c_short, 4),
        ("bitField3", c_short, 6),
        ("bitField4", c_short, 1),
        ("bitField5", c_short, 2),
        ("bitField6", c_short, 2),

        ("bitField7", c_short, 6),
        ("bitField8", c_short, 4),
        ("bitField9", c_short, 4),
        ("bitField10", c_short, 1),
        ("bitField11", c_short, 1)]

class Flags(ctypes.Union):
    _fields_ = [("b", Flags_bits),
                ("asInt", c_short*6)]

def setFlag (flagName, value):
    flags = Flags()
    setattr(flags.b, flagName, value)        
    print getattr(flags.b, flagName)
Run Code Online (Sandbox Code Playgroud)

现在我想知道的是我的标志属于哪个整数(即哪个flags.asInt [i]),我正在寻找一种"get_location"属性来获取结构中的标志位置并从中检索'i'整数的索引,但我找不到任何东西有没有简单的方法呢?

每个回复都要提前感谢!

python ctypes bit-fields

4
推荐指数
1
解决办法
1588
查看次数

C中的重叠位域

我是计算机科学专业的学生。

现在,我正在用C进行计算机架构项目,该项目可模拟处理器。

有很多类型的指令,例如

 31     27 26     22 21     17 16                              0
 ---------------------------------------------------------------
|    op   |    ra   |    rb   |             imm17               |
 ---------------------------------------------------------------

 31     27 26     22 21     17 16                7 6 5 4       0
 ---------------------------------------------------------------
|    op   |    ra   |    rb   |       imm10       | m |  shamt  |
 ---------------------------------------------------------------

 31     27 26     22 21                                        0
 ---------------------------------------------------------------
|    op   |    ra   |                  imm22                    |
 ---------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

因此,我想制作一个C结构,其中包含与每个元素(例如op,ra等)相对应的位域。

起初,我认为我可以使用联合和嵌套结构。

例如,我编写了如下代码:

struct instr_t {
    union {
        uint32_t imm22 : 22;

        struct {
            union { …
Run Code Online (Sandbox Code Playgroud)

c struct unions bit-fields

4
推荐指数
2
解决办法
624
查看次数

结构末尾的未命名位域的目的是什么

我正在学习C.在C Primer Plus中,我看到了一个字段示例如下:

struct box_props {
    bool opaque               : 1;
    unsigned int fill_color   : 3;
    unsigned int              : 4;
    bool show_border          : 1;
    unsigned int border_color : 3;
    unsigned int border_style : 2;
    unsigned int              : 2;
};
Run Code Online (Sandbox Code Playgroud)

我知道中间的4位未命名位字段用于让以下位从一个新字节开始.但是,我不明白为什么在结构的末尾有另一个未命名的位字段.它的目的是什么?有必要吗?

c memory-alignment bit-fields

4
推荐指数
2
解决办法
1627
查看次数

结构中的位顺序不是我所期望的

我有一个使用16位浮点数的框架,我想分离其组件,然后用于32位浮点数。在我的第一种方法中,我使用了移位和类似的方法,尽管这种方法有效,但是阅读却非常混乱。

然后,我想改用自定义位大小的结构,并使用联合写入该结构。

重现该问题的代码:

#include <iostream>
#include <stdint.h>

union float16_and_int16
{
    struct
    {
        uint16_t    Mantissa : 10;
        uint16_t    Exponent : 5;
        uint16_t    Sign : 1;
    } Components;

    uint16_t bitMask;
};

int main()
{
    uint16_t input = 0x153F;

    float16_and_int16 result;
    result.bitMask = input;

    printf("Mantissa: %#010x\n", result.Components.Mantissa);
    printf("Exponent: %#010x\n", result.Components.Exponent);
    printf("Sign:     %#010x\n", result.Components.Sign);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在示例中,我希望尾数为0x00000054,指数为0x0000001F,符号为0x00000001

相反,我得到了尾数:0x0000013f,指数:0x00000005,符号:0x00000000

这意味着从我的位掩码开始,首先取了符号(第一个位),然后是5位到指数,然后是10位到尾数,因此顺序与我想要的顺序相反。为什么会这样呢?

c++ endianness bit-fields

4
推荐指数
1
解决办法
115
查看次数

位域 VS。位掩码

我以前在 C 方面有过一些经验,但是我以前从未见过位域功能。我知道可以使用位掩码来隔离数据结构中的某些位,但是为什么还要使用位域呢?

例如,假设我们要隔离的位是前 3 个最低有效位。然后我们可以写:

/* our bitmasks */
#define FIELD_A (1 << 0)
#define FIELD_B (1 << 1)
#define FIELD_C (1 << 2)

int main(void) 
{ 
    /* the data structure that contains our three fields */
    uint8_t flags;

    /* accessing field A (as a boolean) */
    int bool_a = !!(flags & FIELD_A);

    /* accessing field B (as a boolean) */
    int bool_b = !!(flags & FIELD_B);

    /* accessing field C (as a boolean) */
    int bool_c = !!(flags …
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bitmask bit-fields

4
推荐指数
2
解决办法
1653
查看次数