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