一道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;
}