一种在不使用if语句的情况下评估阈值的方法

时间:2018-02-27 14:44:24

标签: c++ arrays if-statement negative-number

我从源获取数据,如果该值高于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)之外的运行时间将非常感激。

4 个答案:

答案 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;