我从源获取数据,如果该值高于2 ^ 13(8192),则值实际上是负数。有没有办法在不使用if语句的情况下执行以下转换:
int data[SIZE]
for (int i=0; i<SIZE; i++)
if (data[i] > 8191)
data[i] = data[i]-16384;
或
int data[SIZE]
for (int i=0; i<SIZE; i++)
if (data[i] > 8191)
data[i] = ~(data[i] + 1 8292;
任何帮助消除if语句而不增加O(n)之外的运行时间将非常感激。
答案 0 :(得分:1)
你可以使用movfuscator,它是一个C编译器,用x86 mov指令构造整个二进制文件,因此不会使用任何分支指令:D
答案 1 :(得分:0)
没有。 IF语句是计算机的基本操作之一。已经付出了很多努力使它们变得非常非常快。
不要过早浪费时间微观优化。
编写您的应用程序,然后 个人资料,个人资料,个人资料。 一旦您获得有关应用程序速度较慢的硬数据,请花时间优化 >
答案 2 :(得分:0)
根据我的经验,以下内容不会编译为分支,而是编译为cmov:
int data[SIZE];
for (int i = 0; i < SIZE; i++)
{
auto d = data[i];
auto v = d - 16384;
auto condition = d > 8191;
data[i] = condition ? v : d;
}
我确定一个好的优化编译器不会像这样拼写出来。
正如已经指出的那样,在SSE2中还有更多的方法可以做到这一点,也可以使用SSE4混合。
答案 3 :(得分:0)
如果您的代码甚至生成分支,请首先检查编译器输出。编译器可能足够聪明,可以以惊人的方式对其进行优化。
其次,假设第2个补码,您可以执行以下操作(严格来说这是未定义的行为):
data [i] =(((int16_t)data [i])&lt;&lt; 5)&gt;&gt; 5;