[PHP] 按位与& 或| 异或^ 的日常使用
2023-02-18 15:41:20 时间
按位与:
0&0=0; 0&1=0; 1&0=0; 1&1=1;
按位或:
0|0=0; 0|1=1; 1|0=1; 1|1=1;
按位异或,在或的基础上1 1也为0:
0^0=0; 0^1=1; 1^0=1; 1^1=0;
1.一个int型字段,存储十进制的数字,比如说是5
那么该数字转成二进制是101,我自己定义从左往右数,
第一位1,代表某功能自动转发开启
第二位0,代表自动删除关闭
第三位1,代表自动保存开启
2.判断第三位是否开启自动保存的代码
($userStatus & pow(2,3-1))!=0
3.pow是指数表达式函数,2的2次方,转成二进制是0100,按位与0101 & 0100 是0100 十进制为4,因此不等于0为true
4.设置某一位的值,如果要设置为1代码是
$userStatus | pow(2,3-1)
原始值为 0001,要设置第三位为1,0001 | 0100 为0101
5.把某一位设置为0,代码是
$userStatus ^ pow(2,3-1) 0101 ^ 0100 为0001
function setStatus($source,$flag,$value){ if (intval($value) == 1 || strcasecmp($value, 'on') == 0) { $value = 1; } else { $value = 0; } $status = pow(2, $flag - 1); $oldStat = (($source & $status) != 0); if ($oldStat == $value) { return $source; } if ($value) { $source |= $status; } else { $source ^= $status; } return $source; } //001 转成 101 var_dump(setStatus(1,3,'on'));//int(5) //1101 转成 0101 var_dump(setStatus(13,4,0));//int(5)
相关文章
- 缓存一致性和跨服务器查询的数据异构解决方案canal
- 高CPU业务场景下的任务分发方案Gearman搭建一览
- 改造继续之eclipse集成tomcat开发spring mvc项目配置一览
- .net项目架构改造之搭建基于java环境配置一览【上】
- 用java调用.net的wcf其实还是很简单的
- 使用sqlserver搭建高可用双机热备的Quartz集群部署【附源码】
- 采用config方式灵活配置我们的Quarz.net中的Job,Trigger
- 用惯了Task,你应该也需要了解它的内部调度机制TaskScheduler
- Parallel.For 你可能忽视的一个非常实用的重载方法
- 享受release版本发布的好处的同时也应该警惕release可能给你引入一些莫名其妙的大bug
- 使用Task的一些知识优化了一下同事的多线程协作取消的一串代码
- 从真实项目中抠出来的设计模式——第三篇:责任链模式
- 从真实项目中抠出来的设计模式——第二篇:过滤器模式
- 从真实项目中抠出来的设计模式——第一篇:策略模式
- 在redis中使用lua脚本让你的灵活性提高5个逼格
- redis大幅性能提升之使用管道(PipeLine)和批量(Batch)操作
- redis-cli中那些或许我们还不知道的一些实用小功能
- 搭建高可用的rabbitmq集群 + Mirror Queue + 使用C#驱动连接
- 使用专业的消息队列产品rabbitmq之centos7环境安装
- 监视EntityFramework中的sql流转你需要知道的三种方式Log,SqlServerProfile, EFProfile