【问题标题】:Byte array, I need to turn it 90 degrees字节数组,我需要把它转90度
【发布时间】:2016-07-08 19:25:31
【问题描述】:

我带着一个有趣的问题来找你。 我有一个看起来像这样的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];

现在我只需要弄清楚如何不镜像它,我就完成了。

【问题讨论】:

  • 我在这里没有看到10101010 ...向我们展示源代码。
  • 我建议在互联网上搜索“c++ 位图旋转位”。
  • ...我没有看到任何列。
  • 抱歉,不觉得有趣。去过那里,做到了。

标签: c++ arrays algorithm byte


【解决方案1】:

为了便于理解,让我们考虑一个位矩阵:

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 度旋转的情况编写专门的代码,这可能比使用通用矩阵旋转算法更有效)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2018-07-18
    相关资源
    最近更新 更多