我想在数组中存储位(如结构).所以我可以遵循以下两种方法之一
方法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?
对于打包f0并f1放入同一字节的实现,下面的程序是定义的吗?
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:
在前一个和下一个序列点之间,一个对象的存储值最多只能通过表达式的评估来修改一次.[...]
我不清楚这一段对上述计划有何影响.
基于大量随机测试,大多数编译器似乎生成代码,其中两个分配不会干扰.
我需要使用作用域枚举,以便我可以将它们作为特定类型传递给我们的序列化程序.我给了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标准中找不到指定的任何地方.例如,在
struct { signed int x:1; } foo;
Run Code Online (Sandbox Code Playgroud)
是foo.x一个类型的左值int,还是其他什么?int因为你不能在其中存储任何类型的值int,只有0或-1,但它找不到任何类型的语言,这似乎是不自然的.当然,在大多数表达式中使用它,int无论如何它都会被提升,但是实际的类型在C11中有所不同_Generic,而且我在标准中找不到任何关于位域如何与之交互的语言_Generic.
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"类内初始化"功能初始化位字段的正确语法是什么?
有谁知道如何提取位字段成员的大小.下面的代码自然给出了一个整数的大小,但是如何找出有多少位或字节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) 我已经创建了一个将一个方法转换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) 我有这样声明的位字段:
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表示整个字).
非常感谢.
为什么不能取位域的地址?
如何制作指向位字段的指针?
这是代码......
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)