逻辑中的二进制

10 篇文章 0 订阅

位操作在应用层开发上用的很少,一般不会去用它去做数值运算.而在逻辑控制上巧加运用也会发挥强大的特性.

这里举一个实例,比如我们只用PHP控制同一页面上的许多元素的开关状态,这个开关状态可以理解成是与非.用笨拙的方法当然也可以实现,一两个元素没什么,如果几十个上百个呢?

废话不多说,进入主题.

为了方便理解,这里只假设有三个元素需要控制:A, B, C.
1, 首先要做的是把他们组合成数字索引的数组:
$list = array('A', 'B', 'C');

2, 然后把各个元素键值作为2的指数求幂再相加,这是初始值,也是一个总开关标识:
$flag = 0;
foreach($list as $key => $v) {
$flag += pow(2, $k);
}

这就形成了下列二进制的表示:
1 = 00000001 = 2^0 
3 = 00000011 = 2^0 + 2^1 
7 = 00000111 = 2^0 + 2^1 + 2^2 
3, 各个元素的开关控制.
假如,我们想要操作最后一个元素, 也就是C.这里保存到变量$type.
先要得出这个元素在二进制中的表示:
$tmp = 0;     
foreach($list as $k => $v) {
if($v == $type) {
$tmp += pow(2, $k);
}
}
也就是:
4 = 00000100 = 2^2
下面就是开关状态的判断了:
$status = (($flag & $tmp) == 0) ? 0 : 1; // 打开
00000111 & 00000100 = 00000100
重要的要改变这个元素的标识:
$flag = $flag ^ $tmp;

00000111 ^ 00000100 = 00000011



那么下次操作这个元素的的时候计算过程就是:
00000011 & 00000100 = 00000000  // 关闭

00000011 ^ 00000100 = 00000111 // 还原标识


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值