【问题标题】:Alternating between reading forwards and backwards in a loop在循环中向前和向后交替读取
【发布时间】:2017-01-04 12:24:23
【问题描述】:

我的数组长度为 1D m。说 m = 16

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

我实际解释数组的方式是 n x n = m

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

由于我的物理环境设置方式,我需要以这种方式读取数组

0 4 8 12 13 9 5 1 2 6 10 14 15 11 7 3

我想出的作品,但我真的不认为这是最好的方法:

bool isFlipped = true;
int x = 0; x < m; x++
if(isFlipped)
     newLine[x] = line[((n-1)-x%n)*n + x/n)]
else
     newLine[x] = line[x%n*n +x/n]
if(x != 0 && x % n == 0)
     isFlipped = !isFlipped

这给了我所需的结果,但我真的认为有一种方法可以通过纯粹使用数学公式来摆脱这个布尔值。我把它塞进一个 8kb 的微控制器中,我需要尽可能多地节省空间,因为稍后我将进行一些蓝牙通信和更多的数学运算。

编辑:

感谢一位用户,我得到了一个单行解决方案。 (下面将替换 for 循环中的行)

c=x/n
newLine[x] = line[((c+1)%2)*((x%n)*n+c) + (c%2)*((n-1)-2*(x%n))*n ];

【问题讨论】:

    标签: math logic


    【解决方案1】:

    您应该能够利用 n*n 矩阵中的奇数列从下向上读取,偶数列从上向下读取这一事实。

    newLine 中索引 x 处的数字位于 n*n 矩阵的列号 c=floor(x/n) 中。 c%2 对于偶数列是 0,对于奇数列是 1。所以这样的事情应该可以工作:

    int c = x/n;
    newLine[x] = line[(x%n)*n + (c%2)*((n-1)-2*(x%n))*n + c];
    

    【讨论】:

    • 这就是我喜欢互联网的原因。我今天将使用你的方法,看看我能想出什么。会回来汇报的。非常感谢!
    • 所以我稍微修改了您的解决方案。新线[x] = 线[((c+1)%2)*((x%n)*n+c) + (c%2)*((n-1)-2*(x%n)) *n];这对我有用。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2022-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多