我在 stackoverflow 上问了这个问题:
1 2 3 4 5 | inline int test(int n, int tag, int flag) { if (0 == flag) return ((n & tag) == tag); return ((n & tag) != tag); } |
inline int test(int n, int tag, int flag) { if (0 == flag) return ((n & tag) == tag); return ((n & tag) != tag); }
如何将这个简化成不用 if? 答案给出了两种, 一种是 用三元表达式 (ternary operator) 比如
1 2 3 4 | inline int test(int n, int tag, int flag) { return (0 == flag) ? ((n & tag) == tag) : ((n & tag) != tag); } |
inline int test(int n, int tag, int flag) { return (0 == flag) ? ((n & tag) == tag) : ((n & tag) != tag); }
其实三元表达式就有点像 if . else 不是我想要的, 因为有的编程语言并不支持三元表达式, 比如 Delphi/Pascal. 答案给出了另一种, 把 flag 变成 布而值:
1 2 3 4 5 | inline int test(int n, int tag, int flag) { bool b_flag = flag; return !b_flag * ((n & tag) == tag) + b_flag * ((n & tag) != tag); } |
inline int test(int n, int tag, int flag) { bool b_flag = flag; return !b_flag * ((n & tag) == tag) + b_flag * ((n & tag) != tag); }
为什么要这么麻烦去掉 if else 呢? 因为分支判断远远没有顺序的执行来着快(可以利用缓存 prefetching), 如果这行代码被调用很多次, 则这样的优化则能提高不高的效率.但切记,过早过度的优化是万恶之源.(Pre-optimisation is the root of evil)
其实有更简单的:
1 2 3 4 | if (x) return y; else return !y; |
if (x) return y; else return !y;
可以转换成
1 | return !(x^y); // ^ is exclusive or 异或 |
return !(x^y); // ^ is exclusive or 异或
所以,直接翻译过来是
1 | return !(flag ^ ((n & tag) == tag)); |
return !(flag ^ ((n & tag) == tag));
简化一下,
1 | return (flag ^ ((n & tag) != tag)); |
return (flag ^ ((n & tag) != tag));
好吧, 是我想太复杂了.
PS: 这是第 100 篇博文(包括页面).这篇同步到英文算法博客: https://helloacm.com/ternary-operator-and-boolean/
GD Star Rating
a WordPress rating system
本文一共 231 个汉字, 你数一下对不对.a WordPress rating system
上一篇: 更改全站的评论名称
下一篇: 别忽略编译器警告
扫描二维码,分享本文到微信朋友圈