在循环中向前和向后阅读之间交替

时间:2017-01-04 12:24:23

标签: math logic

我的阵列长度为1D。比如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 ];

1 个答案:

答案 0 :(得分: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];