• 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

  • 主页
  • 架构
  • 编程语言
  • 数据存储
  • 网络
  • VMware
  • 服务器
  • 组网
  • AI
  • 算法系列
  • 设计模式
  • 读书笔记
  • 思考
  • 工具
  • 其它技术

一个与运算引发的事故

2024-08-18

今天发生了一起事故,追查下去,找到了一段陈年老代码。

代码逻辑很简单:

1
2
3
4
5
6
7
8
<?php
$a = 1;
$b = 8;
if ($a & $b) {
var_dump('same');
} else {
var_dump('not same');
}

这个代码的作用是什么呢?判断a与b是否相等。

为什么能判断呢?或者说什么条件下这个逻辑是生效的?

聪明的你可能有了答案,当a和b都是2^n的时候。

在位与运算的时候,只有完全一样a&b才能大于零,否则,每一位必然会有一个0,最终结果为0,表示不相等。

这个算是比较巧的写法(这么写的人少),另外理论上这个操作比直接判断相等是要快一些的。

但是却隐藏了两个极大的问题

  1. 数值增长会很快,迅速达到越界的范围,毕竟指数增长啊
  2. 如果这个逻辑一直是由同一个人维护还好,知道赋值必须为2^n,如果代码交接给别的组或者换了一个新人,极有可能不知道这点,赋值的时候没有遵循指数规则,然后就悲剧了

墨菲定律说的是个概率问题,感觉世上的事情没啥能逃脱统计,然后果然就悲剧了。对于系统来说,一个&值多少钱,可能一文不值,也可能是天价。

后来我想了想,在代码层面至少有两个问题

  1. 如果接手别人的代码,一定要看一遍,另外对里面不符合常理的地方一定要跟进,这些地方往往是定律的藏身之所
  2. 写代码的时候,通俗易懂是最重要的,不要去炫技,也不要为了炫技而埋了坑。就对上面举例的代码而言,即没有充分利用每一个数字,而且很可能引发错误,另外其实也提升不了多少性能,优化优化逻辑、改改算法,性能不会比这个提升的多?

最后说一句:

1
2
3
4
5
6
7
8
<?php
$a = 1;
$b = 8;
if ($a == $b) {
var_dump('same');
} else {
var_dump('not same');
}

这个写法不香吗?

扫一扫,分享到微信

微信分享二维码
限流实现2
项目流程管理
© 2025 John Doe
Hexo Theme Yilia by Litten