Code Bye

C移除分支预测 优化函数

一道C的笔试题,用移位操作和掩码来做,一直没实现。

题目要求不能使用条件执行指令,且int 为32位,优化如下函数

int func(int a)
{
if(a>32767)
   return 32767;
if(a<-32768)
   return -32768;
else 
    return a;
}
}
解决方案:5分
inline bool is_plus_long(int a) { return a>32767; }
inline bool is_neg_long(int a){return a<-32768;}
inline bool is_short(int a){return !is_plus_long(a) && !is_neg_long(a);}
//func 的实现
inline int make_short(int a){
         return is_plus_long( a )*32767 + is_neg_long( a )*(-32768) + is_short (a) *a;
}

乘法 实现 分支效果

比较指令可以优化为 非跳转指令

如此即可

不过这种优化,真的有必要么?

解决方案:15分
int func(int a)
{
if(a>32767)
   return 32767;
if(a<-32768)
   return -32768;
else 
    return a;
}
int func2(int a )
{
  int sz = sizeof(int) * CHAR_BIT - 1;
  int bigger = ~((a >> sz) | ((a - 32767) >> sz));  // if a > 32767, bigger == 0xffffffff, else bigger ==0;
  int smaller  = (a >> sz) & ((a + 32768) >> sz); // if a < -32768, smaller == 0xffffffff, else smaller ==0;
  int res = 0;
  res += bigger & 32767;
  res += smaller & (-32768);
  res += (~bigger) & (~smaller) & a;
  return res; 
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C移除分支预测 优化函数