字节数组,我需要把它旋转 90 度
Byte array, I need to turn it 90 degrees
我带着一个有趣的问题来找你。我有一个看起来像这样的uint8_t
数组:
{B10000000,
B00000000,
B10000000,
B00000000,
B10000000,
B00000000,
B10000000,
B00000000}
我需要创建一个基于列返回字节的函数。例如,对于上面的数组
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];
现在我只需要弄清楚如何不镜像它,我就完成了。
为了便于理解,让我们考虑一个位矩阵:
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 度旋转的情况编写专门的代码,这可能比使用通用矩阵旋转算法更有效)。
相关文章:
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- 基于字节数组生成静态范围整数值
- 将字节数组转换为带有字节序问题的指针
- 使用 stbi_write_png,如何将 0 和 1 的矩形字节数组转换为单色 png 文件?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 swig 追加到字节数组
- C++ 替换字节数组中项的顺序
- QDataStream 读取和写入的字节数比 QFile::length() 报告要多
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 如何在C++(Arduino)中将浮点数组转换为字节数组
- 将字节数组转换为多维数组
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- 如何将带有空字符的字节数组馈送到 std::iostream 中?
- C++字节数组到整数
- 将字符串转换为无符号字符数组/字节数组
- 用于 progmem 的C++和头文件压缩的 Web 文件字节数组
- mmap 中的长度是字节数还是页数?
- 如果我向一个12字节的缓冲区写入的字节数少于12,会发生什么情况
- 转换/旋转字节数组中的位
- 字节数组,我需要把它旋转 90 度