当前位置: 首页 > 知识库问答 >
问题:

逆时针旋转字节数组

严兴言
2023-03-14

预期的结果是逆时针旋转字节数组,以获得一个固定的“a”。

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

我如何在C中以更一般的方式逆时针旋转字节数组?

代码:

#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 _ _ _ _
_ _ _ _ _ _ _ _    _ _ _ _ _ _ _ _

共有1个答案

胡向阳
2023-03-14

你的代码看起来真的太过分了。您可以使用嵌套循环来迭代源数据的每一个可能的位,并相应地设置dest数据(这基本上是交换索引),类似于:

#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 - - - - 
- - - - - - - - 

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

 类似资料:
  • 假设我有这样的多维数组:

  • 本文向大家介绍用于数组旋转的Java逆向算法程序,包括了用于数组旋转的Java逆向算法程序的使用技巧和注意事项,需要的朋友参考一下 以下是实现数组旋转的反向算法的Java程序- 示例 输出结果 名为Demo的类包含一个名为“ rotate_left”的函数。 数组以及数组需要旋转的量作为参数传递给函数。 数组的长度也分配给另一个变量。 定义了另一个名为“ array_reversal”的函数,该函

  • 本文向大家介绍用于数组旋转的Python逆向算法程序,包括了用于数组旋转的Python逆向算法程序的使用技巧和注意事项,需要的朋友参考一下 当需要反转旋转的数组时,将定义一个方法,该方法遍历列表并反转列表。定义了另一种方法,该方法旋转列表,并且定义了另一种方法,用于显示列表。一个简单的循环和索引用于实现此目的。 以下是相同的演示- 示例 输出结果 解释 定义了一个名为“ reverse_list”

  • 问题内容: 的在系统调用 包在Golang返回类型,而底层系统调用实际上返回一个指针。它是如何做到的? 更具体地说,在Golang开发人员的此程序包中,该函数仅返回一个指针。如何将其转换为字节片,就像在Unix软件包中一样? 问题答案: 使用该包,您可以在未导出类型的Mmap方法中执行相同的操作: 这是一个操场的例子。

  • NowCoder 题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 解题思路 将旋转数组对半分可以得到一个包含最小元素的新旋转数组,以及一个非递减排序的数组。新的旋转数组的数组元素是原数组的一半,从而将问题规模减少了一半,这种折半性质的算法的时间复杂度为 O(logN)(为了方便,这里将 log2N 写为 lo

  • 问题内容: 我想找出悬停时如何制作 旋转或旋转的图像 。我想知道如何在以下代码上使用 CSS 模仿该功能: 问题答案: 您可以将CSS3过渡与一起使用,以 在悬停时旋转图像 。 旋转图像: