如何简化这个表达式?


我在 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 个汉字, 你数一下对不对.
如何简化这个表达式?. (AMP 移动加速版本)
上一篇: 更改全站的评论名称
下一篇: 别忽略编译器警告

扫描二维码,分享本文到微信朋友圈
b7da545b147a1d85327ebf982e9a9329 如何简化这个表达式? 技术 程序员

评论