字节数组,我需要把它旋转 90 度

Byte array, I need to turn it 90 degrees

本文关键字:旋转 字节数 数组 字节      更新时间:2023-10-16

我带着一个有趣的问题来找你。我有一个看起来像这样的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 度旋转的情况编写专门的代码,这可能比使用通用矩阵旋转算法更有效)。