将索引映射到所需数字集的最有效方法是什么?

问题描述 投票:0回答:1

在一些 C++ 代码中,我正在迭代一个具有索引 (0-7) 的数组,并需要从某个以

a
作为输入的函数计算给定值集
b
i
的最佳方法。

i:  0  1  2  3  4  5  6  7 
---------------------------
a: -1  1 -2  2  1 -1  2 -2
b:  2  2  1  1 -2 -2 -1 -1 

显而易见的解决方案是使用 if 语句。通过一些挖掘和数学,这是我能想到的最好的-

int a = (i%4 == i%2) ? (!(i>=4 ^ i%2) ? -1 : 1) : (!(i>=4 ^ i%2) ? -2 : 2);
int b = (i%4 == i%2) ? (i>=4 ? -2 : 2) : (i>=4 ? -1 : 1);

我发现这段代码非常笨拙,想知道最优化的方法来做到这一点。

c++ math optimization numbers
1个回答
0
投票

我会使用 constexpr 成对的数组,或 c 数组和结构,或这些的任何组合。

完全未经测试的代码

using PairsArray = std::array<std::pair<int, int>, 8>;
constexpr PairsArray PA {
  { -1,2 }, { 1,2 }, { -2, 1 }, {2, 1} // and so on
}

constexpr int DoStuff(int i) {
  return PA[i].first*3+PA[i]*-2;
}

如果可以在编译时完成,则可能计算对 DoStuff 的调用。

© www.soinside.com 2019 - 2024. All rights reserved.