【发布时间】:2021-03-27 10:36:50
【问题描述】:
对不起,我只是想不出一个好的标题。我有一个 8 字节的向量。向量的每个元素都是我正在使用的 8x8 LED 矩阵的列数据。因此,如果向量的第一个元素是“11110000”,则表示该列的前 4 个 LED 点亮,其余的熄灭。我需要将这个“列数据”转换为“行数据”。我会用一个例子告诉你我的意思:
0 1 0 1
1 0 0 1
0 0 1 1
1 1 1 1
= = = =
v1[0] v1[1] v1[2] v1[3]
为简单起见,我将在此示例中使用半字节(实际向量是字节向量)。 v1[0] 是第一列.. v[3] 是最后一列。对于 v1[0] = "0101",MSB 位于 matirx 的顶部,LSB 位于底部(这就是我的 8x8 led 矩阵的组织方式)。现在,我必须取另一个向量,并从第一个向量中收集行,因此“行向量”将如下所示:
v2[0] = 0101
v2[1] = 1001
v2[2] = 0011
v2[3] = 1111
这是我迄今为止尝试过的:
unsigned char vector[8] = {15, 15, 15, 15, 15, 15, 15, 15};
unsigned char x = 0;
unsigned char mask = 128;
for (int i = 0; i < 8; i++)
{
printf("%i ", vector[i]);
}
printf("\n");
for (int i = 0; i < 8; i++)
{
x = 0;
for (int j = 0; j < 8; j++)
{
x |= vector[j] & mask;
x >>= 1;
}
mask >>= 1;
printf("%i ", x);
}
printf("\n");
所以我的列向量是 15,所以“00001111”。行向量的前 4 个元素应为“00000000”,后 4 个元素应为“11111111”。我不使用行的向量是我的代码,为简单起见,我只制作“行”,然后打印它。此代码背后的想法是使用掩码 = 128 ("10000000"),并遍历列向量,并获取每个元素的第一位。当我从一个元素中取一点时,我将行变量“x”向右移动,以便为下一点腾出空间。在我完成一行之后,我将掩码向右移动,以从列中获取第二位。此代码应打印:
15 15 15 15 15 15 15 15
0 0 0 0 255 255 255 255
但它会打印:
15 15 15 15 15 15 15 15
0 0 0 0 7 3 1 0
代码有什么问题?
编辑:让我再举一个例子。如果我的列向量充满了 255,因此每个元素都是“11111111”,这意味着我的行向量也应该充满 255。我的代码而不是这个:
255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255
输出这个:
255 255 255 255 255 255 255 255
127 63 31 15 7 3 1 0
【问题讨论】: