【问题标题】:circular byte shifting in an array数组中的循环字节移位
【发布时间】:2013-05-09 21:01:14
【问题描述】:

我正在编写一个 LED 显示屏 (7x48),我使用的语言是 BASIC(以前没有该语言的经验,但使用 C/C++),我有一个小问题。 我有一个数组(red[20] of byte),当前状态的一个例子是: 为了在这里更容易,让我们说它的红色[3]

10011010 01011100 01011101

现在我需要将数组移动 1,所以在下一个周期中它应该是

00110100 10111000 10111011

所以发生的事情是整个数组向左移动了 1 位

我正在使用的 BASIC 没有任何 .NET API,所以我需要总的低级代码(不一定是 BASIC,我可以翻译它,我只需要知道如何做我受限于 8KB 代码内存,所以我必须完全优化它)

【问题讨论】:

    标签: matrix byte led basic


    【解决方案1】:
    If most significant bit is 1:
        subtract value of most significant bit
        multiply by 2 
        add 1
    otherwise:
        multiply by 2
    

    【讨论】:

      【解决方案2】:

      您应该能够使用位移操作: http://msdn.microsoft.com/en-us/library/2d9yb87a.aspx

      x 成为你要移动的元素:

      x = (x<<1) | (x>>23)
      

      或者一般来说,如果你想左移y位并且总共有n位:

      x = (x<<y) | (x>>(n-y))
      

      我不太了解基础知识,但以下是我会用 C++/Java/C# 语言做的事情:

      假设你有长度为 n 的 red[]:

      int b = 32; //Number of bits per byte (your example showed 24, but usually there are 32)
      int y = 1; //Number of bytes to shift to the left
      int carry = 0;  //The bytes to carry over (I'm assuming that they move up the array from red[0] to red[1], etc.
      
      for (int i=0;i<n;i++)
      {
          int newCarry = (red[i]>>(n-y));
          red[i] = (red[i]<<y) | carry;
          carry = newCarry;
      }
      
      //Complete the loop
      red[0]|=carry;
      

      【讨论】:

      • 是的,我知道这些,但基本支持某种携带吗?例如,我需要将值从 red[2] 传输到 red[1] 的最后一位。
      • 我仍然不确定您是如何将值从一个元素传递到另一个元素的?比如如果 red[1] 是 0xFF 并且 red[2] 是 0x00,在
      • 哦,我误会了。我会更新我的解决方案。您可以制作数组的新副本吗?
      • 是的,但是我正在编程一个 16 位 PIC,所以我的内存有限,尽管我的旧解决方案有 3 个数组和大量代码,如果你能找到最好的方法,那就太棒了.
      • 更新了我的答案以使用数组。
      猜你喜欢
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-24
      • 2010-11-19
      • 1970-01-01
      • 2021-12-11
      相关资源
      最近更新 更多