更高效的RAM布尔数组?Arduino环境

Ada*_*dam 5 c boolean arduino boolean-operations

我在Arduino环境中有一些代码,它需要x(以8为增量)布尔值,这些布尔值可以在运行时为某些移位寄存器代码操作.所以目前我正在使用像这样的布尔数组:

 #define number_of_shiftRegisters 220 //num of 8 bit shift registers

 #define numOfRegisterPins number_of_shiftRegisters * 8 //number of booleans needed

 boolean registers[numOfRegisterPins]; //boolean array
Run Code Online (Sandbox Code Playgroud)

但是我的RAM耗尽了大约200(1600布尔)并且不知道为什么直到我看到它,即使布尔值为1位,它们也存储在8位数据中.

正如我之前所说,所需的bool数量总是增加8,所以我不知道这是否对我有利.

是否有更高内存效率的方式来存储1000多个布尔值,仍然能够通过索引引用它们?

或者......至少更高的内存效率,不会花费更多的CPU时间来设置和迭代?

我曾想过一个char数组,然后对每个字符进行掩码以访问各个位.但我不知道是否有更简单的方法,或者这是否会占用更多的CPU时间.

Jac*_*ack 6

是的,您可以轻松使用屏蔽来解决该问题.

每个字节(unsigned char)将包含8个布尔值,以获得values & (1 << i)在if测试中可以使用的第i个,并且它将起作用,因为如果设置了正确的位,则结果将是!=到0.

要设置一点,只需将它和/或移动到值:( values | (1 << i)如果未设置,则必须将AND与0一起).

另一个解决方案可能是使用压缩结构:

struct Bools
{
  int b1 : 1;
  int b2 : 1;
  int b3 : 1;
  ... // up to b8
}
Run Code Online (Sandbox Code Playgroud)

这应该管理直接访问布尔值的元素,并允许您定义一个联合来管理它们,或者将8个单位布尔值视为字节.