如何有效地写入三个 32 位整数数组的每 12 位?

问题描述 投票:0回答:1

我正在 Arduino R4 Wifi 上进行编码,并尝试使用板载 8x12 LED 矩阵。 根据官方文档,可以将帧存储为字节数组:

uint8_t frame[8][12] = {
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
  { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
};

或作为三个 32 位整数的数组:

unsigned long frame[] = {
  0,
  0,
  0
};

后者显然具有更高的内存效率,但我无法弄清楚如何有效地操作其中的特定位。例如,如果我想使用字节数组打开最右边的列,我可以这样做:

for(int i = 0; i < 8; i++){
  frame[i][12] = 1;
}

但是,我似乎无法找到一种有效的方法将相同的 for 循环映射到 long 数组。这是所需的映射:

i =
0 -> frame[0], position 20
1 -> frame[0], position 8
2 -> frame[1], position 28
3 -> frame[1], position 16
4 -> frame[1], position 4
5 -> frame[2], position 24
6 -> frame[2], position 12
7 -> frame[2], position 0

我能够想出这个循环:

for(int i = 0; i < 8; i++){
  bitWrite(frame[(i+1)/3)], ((7-i) / 3) * 4) + (((7 - i) % 3) * 12), 1);
}

这显然很难看,而且计算效率似乎很低。它有效,但不太漂亮。

arduino arduino-c++
1个回答
0
投票

存储 12x8 位数组的最有效方法是 12 字节数组。

如:

uint8_t frame[12] = {};

您所需要的只是访问各个位的简单函数,例如:

// 假设 x 和 y 在范围内。 内联无效 led_on(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) frame[x] |= (1 << y); }

内联 void led_off(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) frame[x] &= ~(1 << y); }

内联 bool get_led(int x, int y) { // 断言(0 <= x && x < 12) // assert(0 <= y && y < 8) return (frame[x] & (1 << y)) != 0; }

© www.soinside.com 2019 - 2024. All rights reserved.