PHP二进制位运算实现状态管理
作者:zhirong1230 创建时间:2017-04-22 阅读次数:578
PHP二进制位运算实现状态管理
在数据库的设计中通常会遇到一个比较麻烦的事情,那就是存储多种可复选状态应当如何设计,比如:商品状态,访问权限,会员状态等信息。有些程序员或DBA会将每一个状态设置一个字段进行存储,但是这样会浪费非常多的存储空间,也会使系统的开发更加复杂。其实,大多数的系统都会使用二进制进行状态位的存储与管理。
例如:我们要实现对商品的状态管理,商品的状态分别有:新品、热销、精品、店长推荐。主要有两种实现方法:
第一:使用多个字段进行存储的做法,分别为每一个状态设置一个字段进行存储与管理,一共需要4个字段。
第二:使用二进制进行状态位控制的做法,设置1个字段进行存储与管理,类型是整型。
那么,如何使用二进制实现对状态的管理?
首先来回顾一下PHP中的位运算
位运算是针对十进制整数在二进制的基础上进行的运算,即需要将十进制数转换成二进制之后才进行按对应的每位上值的运算。在PHP中的位运算符有:&(位与) |(位或) ~(位非) ^(异或) <<(左移) >>(右移) 。由于二进制数只有两个数字,分别是0和1 ,所以通常用于记录状态类数据。不仅可以有效提高执行效率,还能有效节省存储空间。
运行原理:
1个整型数据占4个字节,1个字节由8个二进制位组成,于是,要表现出十进制的1、2、4、8 分别为:
00000000 00000000 00000000 00000001 //十进制数:1
00000000 00000000 00000000 00000010 //十进制数:2
00000000 00000000 00000000 00000100 //十进制数:4
00000000 00000000 00000000 00001000 //十进制数:8
我们可以看出,它们分别代表着一个位置上的状态。我们可以将商品的四个状态分别用4个状态位来表示,即:
00000000 00000000 00000000 00000001 //表示新品
00000000 00000000 00000000 00000010 //表示热销
00000000 00000000 00000000 00000100 //表示精品
00000000 00000000 00000000 00001000 //表示店长推荐
于是:
当管理员选择商品状态为热销时,只需要将十进制数2存入数据库中即可。
当管理员选择商品状态为新品时,只需要将十进制数1存入数据库中即可。
当管理员选择商品状态为新品和热销时,二进制值为 00000011,转换为十进制数为3,所以只需要将十进制数3存入数据库中即可表示目前商品状态为新品和热销。
当管理员选择商品状态同时为新品、热销、精品、店长推荐时,四个状态位都被开启,此时的二进制值为 00001111,即十进制的15。也就是说,数字15即代表了四个商品状态同时开启。
接着我们再来看一下如何实现对商品的状态管理。
对商品状态进行管理包含了:判断状态,开启状态,关闭状态。但是有一个前提条件是,必须要有一状态位常量作为参考对象,也就是十进制的1、2、4、8、16等各状态位单独表示的数字。
判断状态:使用状态位常量和商品状态值进行 位与(&)运算,结果为真则为开启,为假则为关闭。
开启状态:使用状态位常量和商品状态值进行 位或(|)运算,将结果重新赋值给商品状态变量。
关闭状态:使用状态位常量取反后再和商品状态值进行 与(&)运算,将结果重新赋值给商品状态变量。
具体实现代码:(仅做判断是否选中商品状态)
HTML文件:
商品状态:
PHP文件:
//接收数据
$status=array_sum($_POST['status']);
define('S1',1);
define('S2',2);
define('S3',4);
define('S4',8);
//使用状态位常量作为判断依据
if(S1 & $status){
echo '新品:是';
}else{
echo '新品:否';
}
echo '
';
if(S2 & $status){
echo '热销:是';
}else{
echo '热销:否';
}
echo '
';
if(S3 & $status){
echo '精品:是';
}else{
echo '精品:否';
}
echo '
';
if(S4 & $status){
echo '店长推荐:是';
}else{
echo '店长推荐:否';
}
?>
可见,在 $status 变量中保存了商品的4个选项共8种状态,只需要一个字段即可存储商品的状态数据。
所以,使用二进制位运算可以很方便的对状态位进行控制和管理,在进行数据库设计时只需要一个整型字段即可存储多个状态信息。运算效率非常高,占存储空间少。这样好用的新技能,大家get了么?
关键词(keywords):PHP二进制位运算实现状态管理
前一篇: 微博神秘代码能获得大量点赞!连中国联通客服都忍不住验证一下 后一篇:支付宝宣布放弃社交,网友:感觉挖井快挖到水了却要换地方挖