字节数组,我需要将其旋转90度

时间:2016-07-08 19:25:31

标签: c++ arrays algorithm byte

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

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

1 个答案:

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