c - 逆时针旋转字节数组

标签 c arrays arduino bit-shift

有一个给定的字节数组,它代表一个大写的“A”,它位于正确的站点上。 (source)

预期结果是逆时针旋转字节数组以获得站立的“A”。

我将给定数组转换为旋转版本的尝试有效,但效果不佳。我的代码中的“loop()”中的位移和计算部分的某些内容不正确。因此我必须分别处理 x==5 和 x==6。

如何在 c 中以更通用的方式逆时针旋转字节数组?

最后,该阵列显示在 Arduino 上的 8x8 LED 矩阵上。请参阅下面的代码和输出。

代码:

#include "LedControl.h"
LedControl lc=LedControl(12,11,10,4);

void setup(){
  for (int addr=0; addr<lc.getDeviceCount(); addr++){
    lc.shutdown(addr,false);
    lc.setIntensity(addr,0);
    lc.clearDisplay(addr);
  }
}

void loop(){
  // given
  byte a[5]={B01111110,B00010001,B00010001,B01111110,B00000000};

  // expected
  byte a2[8]={B01100000,B10010000,B10010000,B10010000,B11110000,B10010000,B10010000,B00000000};

  // rotated
  byte a3[8];
  byte row;
  for (int x = 0; x < 8; x++){
    row = B00000000;
    for (int y = 0; y < 5; y++){
      if (x==0 || x==1 || x==2 || x==3 || x==4) {
        row |= (a[y] & B00000001 << x) << 7-x-y;
      }
      if (x==5) {
        row |= (a[0] & B00100000) << 2;
        row |= (a[1] & B00100000) << 1;
        row |= (a[2] & B00100000);
        row |= (a[3] & B00100000) >> 1;
      }
      if (x==6) {
        row |= (a[0] & B01000000) << 1;
        row |= (a[1] & B01000000);
        row |= (a[2] & B01000000) >> 1;
        row |= (a[3] & B01000000) >> 2;
      }
    }
    a3[x] = row;
  }

  // output
  for(int i=0; i<8; i++){
    lc.setRow(0,i,a[i]); // given
    lc.setRow(1,i,a2[i]); // expected
    lc.setRow(2,i,a3[i]); // rotated
    delay(100);
  }
}

输出 LED:

given a            expected a2
                   rotated a3

_ o o o o o o _    _ o o _ _ _ _ _
_ _ _ o _ _ _ o    o _ _ o _ _ _ _
_ _ _ o _ _ _ o    o _ _ o _ _ _ _
_ o o o o o o _    o _ _ o _ _ _ _
_ _ _ _ _ _ _ _    o o o o _ _ _ _
_ _ _ _ _ _ _ _    o _ _ o _ _ _ _
_ _ _ _ _ _ _ _    o _ _ o _ _ _ _
_ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _

最佳答案

你的代码看起来确实有点过头了。您可以使用嵌套循环来迭代源数据的任何可能位并相应地设置目标数据(基本上交换索引),例如:

#include <stdio.h>

typedef unsigned char byte;

void printCharacter(const byte* data, size_t length)
{
  for (size_t i = 0; i < length; ++i)
  {
    for (size_t j = 0; j < 8; ++j)
    {
      const unsigned char mask = 1 << j;
      printf("%c ", data[i] & mask ? 'o' : '-');
    }
    printf("\n");
  }
}

void rotate(const byte* source, byte* dest, size_t length)
{
  /* for each bit position starting from first */
  for (size_t j = 0; j < 8; ++j)
  {
    /* this is the mask of the i-th bit in source data */
    const unsigned char mask = 1 << j;

    /* for each row in source data (which will become column) */
    for (size_t i = 0; i < length; ++i)
    {
      /* if j-th bit of i-th row set */
      if (source[i] & mask)
      /* then set i-th bit of j-th row */
        dest[j] |= 1 << i;
    }
  }
}

int main() {
  byte a[5]= { 0b01111110,0b00010001,0b00010001,0b01111110,0b00000000 };
  byte b[8]= { 0 };
  printCharacter(a, 5);
  rotate(a, b, 5);
  printCharacter(b, 8);
  return 0;
}

现在输出

- o o o o o o - 
o - - - o - - - 
o - - - o - - - 
- o o o o o o - 
- - - - - - - - 

- o o - - - - - 
o - - o - - - - 
o - - o - - - - 
o - - o - - - - 
o o o o - - - - 
o - - o - - - - 
o - - o - - - - 
- - - - - - - - 

这并不完全是您正在寻找的,但您只需要根据您想要的旋转调整掩码/索引以从第一个/最后一位开始。

关于c - 逆时针旋转字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41923609/

相关文章:

检查C中输入是否为浮点型?

python - 从Python到C

c - 为什么常量的语法中没有符号字符?

C++如何在给定范围内添加数组中的数字?

arduino - 无法使用 Arduino 对 ATtiny2313a 进行编程。我的芯片变砖了吗?

c++ - 应该始终调用 glfwDestroyWindow 吗?

arrays - 交错数组作为 vba sub 的参数

php - 如何在字符串中的某个字符之后按字母顺序对php数组进行排序

c++ - Arduino IDE 无法识别 .c 文件是 .cpp

java - 如何将 GPS 设备与 Android 应用程序连接