标签: bit-fields

位字段与Bitset

我想在数组中存储位(如结构).所以我可以遵循以下两种方法之一

方法1(AN 1)

struct BIT
{
   int data : 1
};

int main()
{
   BIT a[100];
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

方法2(AN 2)

int main()
{
    std::bitset<100> BITS;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么有人比AN 1更喜欢AN 2?

c++ bitset bit-fields

17
推荐指数
2
解决办法
1万
查看次数

位域和序列点

对于打包f0f1放入同一字节的实现,下面的程序是定义的吗?

struct S0 {
       unsigned f0:4;
       signed f1:4;
} l_62;

int main (void) {
       (l_62.f0 = 0) + (l_62.f1 = 0);
       return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对C99和C11的答案感兴趣,如果有理由认为它在那里是不同的.

在C99中,我发现的只有6.5:2:

在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次.[...]

我不清楚这一段对上述计划有何影响.

基于大量随机测试,大多数编译器似乎生成代码,其中两个分配不会干扰.

c c99 sequence-points bit-fields c11

17
推荐指数
1
解决办法
704
查看次数

gcc抑制警告"太小而无法容纳所有值"

我需要使用作用域枚举,以便我可以将它们作为特定类型传递给我们的序列化程序.我给了enum成员的显式整数值Enum1.

我已将两个与上述描述相匹配的范围内的枚举放入一个位域中

enum class Enum1 {
    value1 = 0x0,
    value2 = 0x1,
    value3 = 0x2
};
enum class Enum2 {
    value1 = 0x0,
    value2,
    value3,
 // ...
    value14
};

struct Example {
    Enum1 value1 : 2;
    Enum2 value2 : 6;
}
Run Code Online (Sandbox Code Playgroud)

现在无论我在哪里使用该Example类型,我都会收到警告"'Example :: value1'太小而无法容纳'Enum1'的所有值",同样适用于Enum2.请注意,这不是我们所定义的值的情况下,我们不关心在所有与这些以外的值.

这在我们的构建过程中是一个非常严重的分心 - 项目庞大而复杂,我们不希望扫描其中的许多警告(并且有很多).

我找了一个GCC(G ++)标志来禁用特定的警告.有没有我可以通过命令行?理想情况下,如果可能的话,我会使用警告编译指示在本地禁用它.

此时几乎没有改变代码结构的余地,但我们确实可以删除这些虚假警告.

编辑:添加标识已更改的范围枚举.

c++ enums gcc suppress-warnings bit-fields

17
推荐指数
1
解决办法
1817
查看次数

比特域的类型是什么?

我在C标准中找不到指定的任何地方.例如,在

struct { signed int x:1; } foo;
Run Code Online (Sandbox Code Playgroud)

foo.x一个类型的左值int,还是其他什么?int因为你不能在其中存储任何类型的值int,只有0或-1,但它找不到任何类型的语言,这似乎是不自然的.当然,在大多数表达式中使用它,int无论如何它都会被提升,但是实际的类型在C11中有所不同_Generic,而且我在标准中找不到任何关于位域如何与之交互的语言_Generic.

c language-lawyer bit-fields c11

16
推荐指数
2
解决办法
3059
查看次数

位字段"类内初始化"导致"错误:左值作为赋值的左操作数需要左值"

struct bitfield {
  int i = 0;  // ok
  int j : 8 = 0;  // error: lvalue required as left operand of assignment
};
Run Code Online (Sandbox Code Playgroud)

使用C++ 11"类内初始化"功能初始化位字段的正确语法是什么?

c++ bit-fields in-class-initialization c++11

16
推荐指数
2
解决办法
2034
查看次数

位域成员的大小?

有谁知道如何提取位字段成员的大小.下面的代码自然给出了一个整数的大小,但是如何找出有多少位或字节mybits.one?我已经尝试过,sizeof(test.one)但显然无法正常工作.我意识到这是一个衡量标准:

#include <iostream>

using namespace std;

int main()
{
    struct mybits {
        unsigned int one:15;
    };

    mybits test;
    test.one = 455;
    cout << test.one << endl;
    cout << "The size of test.one is:  " << sizeof(test) << endl;
}
Run Code Online (Sandbox Code Playgroud)

c++ bits bit-fields

16
推荐指数
2
解决办法
3013
查看次数

将位域整数作为列表

我已经创建了一个将一个方法转换int为一个位域(在一个列表中)并且它可以工作,但我确信有更优雅的解决方案 - 我只是一直盯着它看.

我好奇,你怎么把a转换成一个int代表的位域list

def get(self):
    results = []

    results.append(1 if (self.bits &   1) else 0)
    results.append(1 if (self.bits &   2) else 0)
    results.append(1 if (self.bits &   4) else 0)
    results.append(1 if (self.bits &   8) else 0)
    results.append(1 if (self.bits &  16) else 0)
    results.append(1 if (self.bits &  32) else 0)
    results.append(1 if (self.bits &  64) else 0)
    results.append(1 if (self.bits & 128) else 0)

    return results

def set(self, pin, direction):
    pin -= 1 …
Run Code Online (Sandbox Code Playgroud)

python list bit-fields

15
推荐指数
2
解决办法
2万
查看次数

ANSI C是否支持有符号/无符号位字段?

将位字段限定为有符号/无符号是否有意义?

c struct bit-fields

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

将位字段转换为int

我有这样声明的位字段:

typedef struct morder {
    unsigned int targetRegister : 3;
    unsigned int targetMethodOfAddressing : 3;
    unsigned int originRegister : 3;
    unsigned int originMethodOfAddressing : 3;
    unsigned int oCode : 4;
} bitset;
Run Code Online (Sandbox Code Playgroud)

我也有int数组,我想从这个数组得到int值,它表示这个位字段的实际值(实际上是某种机器字,我有它的部分,我想要int表示整个字).

非常感谢.

c bit-fields

14
推荐指数
2
解决办法
2万
查看次数

c - 不能取位域的地址

为什么不能取位域的地址?

如何制作指向位字段的指针?

这是代码......

struct bitfield {
    unsigned int a: 1;
    unsigned int b: 1;
    unsigned int c: 1;
    unsigned int d: 1;
};

int main(void)
{
    struct bitfield pipe = {
        .a = 1, .b = 0,
        .c = 0, .d = 0
    };
    printf("%d %d %d %d\n", pipe.a,
            pipe.b, pipe.c, pipe.d);
    printf("%p\n", &pipe.a); /* OPPS HERE */
    // error: cannot take address of bit-field ...
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c pointers syntax-error memory-address bit-fields

14
推荐指数
3
解决办法
2万
查看次数