一个与运算引发的事故

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

代码逻辑很简单:

<?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. 写代码的时候,通俗易懂是最重要的,不要去炫技,也不要为了炫技而埋了坑。就对上面举例的代码而言,即没有充分利用每一个数字,而且很可能引发错误,另外其实也提升不了多少性能,优化优化逻辑、改改算法,性能不会比这个提升的多?

最后说一句:

<?php
$a = 1;
$b = 8;
if ($a == $b) {
    var_dump('same');
} else {
    var_dump('not same');
}

这个写法不香吗?

最后

大家如果喜欢我的文章,可以关注我的公众号(程序员麻辣烫)

我的个人博客为:https://shidawuhen.github.io/

往期文章回顾:

技术

  1. 秒杀系统
  2. 分布式系统与一致性协议
  3. 微服务之服务框架和注册中心
  4. Beego框架使用
  5. 浅谈微服务
  6. TCP性能优化
  7. 限流实现1
  8. Redis实现分布式锁
  9. Golang源码BUG追查
  10. 事务原子性、一致性、持久性的实现原理
  11. CDN请求过程详解
  12. 常用缓存技巧
  13. 如何高效对接第三方支付
  14. Gin框架简洁版
  15. InnoDB锁与事务简析
  16. 算法总结

读书笔记

  1. 敏捷革命
  2. 如何锻炼自己的记忆力
  3. 简单的逻辑学-读后感
  4. 热风-读后感
  5. 论语-读后感
  6. 孙子兵法-读后感

思考

  1. 项目流程管理
  2. 对项目管理的一些看法
  3. 对产品经理的一些思考
  4. 关于程序员职业发展的思考
  5. 关于代码review的思考
  6. Markdown编辑器推荐-typora
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员麻辣烫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值