[英]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
分支是绝对必要的并且不能删除,并且可以通过简单的按位运算或类似的操作替换哪一个,该怎么办?
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;
}
}
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.