我正在研发一个只有2KB SRAM的微控制器,并且迫切需要节省一些内存.试图找出如何使用位域将8 0/ 1值放入单个字节但不能完全解决的问题.
struct Bits
{
int8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
int main(){
Bits b;
b.b0 = 0;
b.b1 = 1;
cout << (int)b.b0; // outputs 0, correct
cout << (int)b.b1; // outputs -1, should be outputting 1
}
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
例如:
int main(void) {
Int i = Int(3); //3-bit integer
i = 1; //Represented as: 001
}
Run Code Online (Sandbox Code Playgroud)
问题
我正在做一些固件编码,并有很多位掩码来管理.到目前为止,我一直在为每个要掩盖的字段重复相同的块,如下所示:
#define LinkStateMask 0x1
#define LinkStateShift 8
#define LinkState(x) (((x) >> LinkStateShift) & LinkStateMask)
Run Code Online (Sandbox Code Playgroud)
请注意,这些字段通常是多位字段,因此并不总是保证掩码0x1.最终的宏可以很容易地在代码中使用,这是我非常喜欢的:
if( LinkState(temp) == 0 ) {
// Link is down, return error
return -ENODEV;
}
Run Code Online (Sandbox Code Playgroud)
问题
有没有办法让C预处理器为我生成这些宏?我知道预处理器只能在一次通过中工作,所以宏不能直接定义另一个,但希望还有另一种方法.
理想情况下,我想写一些类似于以下内容的东西,并使用与上面第二个清单相同的C代码:
BIT_FIELD(LinkState, 8, 0x1) // BIT_FIELD(name, lsb, mask)
Run Code Online (Sandbox Code Playgroud)
对我来说,关键是在主C文件中保留符号命名的函数式用法,而不必在BIT_FIELD(...)每次需要生成掩码时编写整个调用(其中一些字段被广泛使用,导致维护噩梦).
最后一个限制:我需要的字段稀疏地分散在数百个寄存器中.如果可能的话,我真的想避免struct为每个人定义一个,因为我通常只需要一个或两个字段.
我有这两种结构: - 1.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
Run Code Online (Sandbox Code Playgroud)
这个结构有匿名联合,当我计算这个结构的大小时 - 它出来是12个字节(4 + 4 + 4).这可以.
2.
typedef struct bitfield
{
unsigned int a:16;
unsigned int b:17;
union u
{
unsigned int c:4;
unsigned int d:32;
};
}bfield;
Run Code Online (Sandbox Code Playgroud)
但我在32位机器上的DevC++编译器为这个结构的大小打印了8个字节.我不明白为什么它会出现8.
我们正在做一些关于随机数的实验.给出的数据存储在.bin文件中,根据提供程序,它存储在独立的位中,也就是说,每个位都是假设的bool随机变量.
现在我想在程序中使用这个输入,但是当bool占用1个BYTE并且int占用4个字节时,我不知道如何将它读入C++中的变量.似乎ifstream.read(s,n)也只取n作为char的数量.
有没有办法从文件中读取位数据?谢谢!