简体   繁体   English

如果条件来自简单函数

[英]Remove if conditions from simple function

I need to remove as many if conditions as possible from the two functions below: 我需要从以下两个函数中删除尽可能多的条件:

inline int inc_with_1bit_saturation(int counter)
{
    if (counter == 1)
        return --counter;
    return ++counter;
}

void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
    int counter = 0;

    for (int i = 0; i < size; ++i)
    {
        if (input[i] != counter)
        {
            counter = inc_with_1bit_saturation(counter);
            output[i] = 0;
        }
        else output[i] = 1;
    }
}

How can I do that and what if branch is absolutely necessary and cannot be removed and which one can be replaced by simple bitwise operations or something like that? 我该怎么办? if分支是绝对必要的并且不能删除,并且可以通过简单的按位运算或类似的操作替换哪一个,该怎么办?

Update 1 更新1

According to User JSF 's great tip, the code is now looking like this: 根据用户JSF的绝妙技巧,代码现在看起来像这样:

void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
    int counter = 0;

    for (int i = 0; i < size; ++i)
    {
        if (input[i] != counter)
        {
            counter = 1 - counter;
            output[i] = 0;
        }
        else output[i] = 1;
    }
}

Update 2 更新2

Thanks to Cantfindname , the code became like this: 多亏了Cantfindname ,代码变得像这样:

void branch_prediction_1bit_saturation(int* input, int* output, int size)
{
    int counter = 0;

    for (int i = 0; i < size; ++i)
    {
        output[i] = counter == input[i];
        counter = output[i] * counter + (1 - output[i])*(1 - counter);
    }
}

And this completely solves the question. 这就完全解决了问题。

For the if statement inside the loop: 对于循环内的if语句:

output[i] = (int)(input[i]==counter);
counter = output[i]*counter + (1-output[i])*(1-counter) //used JSF's trick

True converts to 1 and false to 0, according to this: bool to int conversion 根据以下内容,将true转换为1,将false转换为0: bool到int转换

function inc_with_1bit_saturation is equivalent of modulo 2 . 函数inc_with_1bit_saturation等于模2 So you can replace 所以你可以更换

counter = inc_with_1bit_saturation(counter);

With

counter = (counter+1) % 2;
void branch_prediction_1bit_saturation(int* input, int* output, int size) {

    int counter = 0;

    for (int i = 0; i < size; ++i)
    {
        output[i] = (int)!((!!input[i]) ^ counter);
        counter = (int)((!!input[i]) & counter) | ((!!input[i]) & !counter);
    }
}

A is logic input[i]; A是逻辑输入[i];

B is logic counter; B是逻辑计数器;

The truth table for input[i] != counter is: input [i]!=计数器的真值表为:

AB AB

0 0 | 0 0 | 0 --> (0 & 0) | 0->(0&0)| (0 & !0) = 0 | (0&!0)= 0 | 0 = 0 0 = 0

0 1 | 0 1 | 0 --> (0 & 1) | 0->(0&1)| (0 & !1) = 0 | (0&!1)= 0 | 0 = 0 0 = 0

1 0 | 1 0 | 1 --> (1 & 0) | 1->(1&0)| (1 & !0) = 0 | (1&!0)= 0 | 1 = 1 1 = 1

1 1 | 1 1 | 1 --> (1 & 1) | 1->(1&1)| (1 & !1) = 1 | (1&!1)= 1 | 0 = 1 0 = 1

The truth table for output[i] 输出真值表[i]

AB AB

0 0 | 0 0 | 1 --> !(0 ^ 0) = !(0) = 1 1->!(0 ^ 0)=!(0)= 1

0 1 | 0 1 | 0 --> !(0 ^ 1) = !(1) = 0 0->!(0 ^ 1)=!(1)= 0

1 0 | 1 0 | 0 --> !(1 ^ 0) = !(1) = 0 0->!(1 ^ 0)=!(1)= 0

1 1 | 1 1 | 1 --> !(1 ^ 1) = !(0) = 1 1->!(1 ^ 1)=!(0)= 1

:) :)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM