我带着一个有趣的问题来找你。
我有一个uint8_t
数组,如下所示:
{B10000000,
B00000000,
B10000000,
B00000000,
B10000000,
B00000000,
B10000000,
B00000000}
我需要创建一个基于列返回Bytes的函数。 例如,对于上面的数组
row(0) = B10101010
row(1) = B00000000
etc
到目前为止我是如何做到的
static uint8_t column = B00000001;
static uint8_t k = 0;
static uint8_t factor[7];
static uint8_t rows[7];
rows[k] = 0;
for(int i=0;i<8;i++){
factor[i] = led[i] & column;
factor[i] >>= k;
factor[i] <<= i;
rows[k] += factor[i];
}
if (k < 7) {
column = column << 1;
k = k + 1;
}
else {
column = B00000001;
k = 0;
}
}
但它对我来说效果不佳。有什么想法吗?
编辑:我的坏。刚刚编辑过:
static uint8_t factor[8];
static uint8_t rows[8];
现在我只需要弄清楚如何不镜像它,我已经完成了。
答案 0 :(得分:0)
为了便于理解,让我们考虑一个位矩阵:
0110 0101
1010 0001
1100 1100
0101 0101
矩阵的旋转算法无论其内部类型如何都是相同的 在上面的矩阵中,有8列比特,4行。
这里最大的区别是访问各个位 所以我们需要的是位(行,列)到(字节地址,位偏移)之间的某种转换。
我们知道使用整数矩阵,我们可以使用公式将它们挤压成一维数组:
[1] linear_offset = row * maximum_columns + column;
我们想要一个类似的公式,但是对于位和字节。
只使用一个维度,我们可以通过以下方式计算字节和位偏移:
unsigned int byte_offset = column / (BITS_PER_BYTE);
unsigned int bit_offset = column % (BITS_PER_BYTE);
根据等式[1],线性偏移需要行。在我们的例子中,我们需要计算每行的字节数。每行的字节数取决于每行的最大列数。所以我们有:
unsigned int linear_byte_offset = row * ((MAXIMUM_COLUMNS + BITS_PER_BYTE - 1) / BITES_PER_BYTE) + byte_offset;
改变一下:
// Clear the bit
byte = byte & (~(1 << bit_offset));
// Then set the bit
byte = byte | (1 << bit_offset);
通过上述算法,我们可以读取矩阵中的任何位位置,并通过引用它们的行和列纵坐标来写入任何位位置。
这意味着可以使用任何使用行和列定位(纵坐标)的旋转算法;例如旋转算法。
剩下的算法留作OP的练习。
(注意:对于90度旋转的情况,可以编写专门的代码,这可能比使用通用矩阵旋转算法更有效。)