位运算符——管理事务的开关状态

1,什么是开关状态

  现实中,有很多数据都是只有两种结果(值)的,对应的其实就是我们的布尔类型的值。

这里,所谓的管理一组事务的开关状态,应该理解为其实就是管理若干个只有2个状态的“数据符号”。

  比如:有5个灯泡,对应5个状态数据。这5个灯泡,就有25 种状态呢

这里的管理目标是:使用一个变量,就可以表达若干个数据的“当前状态”。具体有3个任务:

  1、通过该变量,可以获知任何一个数据(灯泡)的当前状态。

  2、通过该变量,可以将一个一个数据的状态“关闭”;

  3、通过该变量,可以将一个一个数据的状态“开启”;

<?php
//假设,有5个灯泡需要管理,需要实现以下的功能目标
//1,可以指定任意一个灯泡的“当前状态”
//2,可以打开指定的任意一个灯泡

//首先,需要设定对应的5个常量,代表对应的5个灯泡

define("D1" ,1);    //对应的二进制值为:00000001
define("D2" ,2);    //对应的二进制值为:00000010
define("D3" ,4);    //对应的二进制值为:00000100
define("D4" ,8);    //对应的二进制值为:00001000
define("D5" ,16);   //对应的二进制值为:00010000
//更多的灯,也按此规律定义常量值!!!

//然后,定义一个变量,该变量就代表这5个灯泡的“任意组合状态”值;
$state = 10;   //其对应的为二进制值为:00001010
               //此时,它其实也表示第2个和第4个灯凉
//$state =7;   //其对应的为二进制值为:00000111
//$state =71;  //其对应的为二进制值为:00010001
//注意:以上3个赋值,只是表示$state的值可以是“任意的”

//任务1,可以指定任意一个灯泡的“当前状态”

//需求1a:请输入灯泡1的状态
//按此算法逻辑就可以判断灯1
//分析:
//$state的值为:00001010
//D1的值为    :00000001
//              &
//------------------------
//              00000000
if(($state & D1) >0){
    
    echo "<br />灯1是亮的";
}else
{
    echo "<br />灯1是灭的";
}

//需求1b:请输入灯泡2的状态;
if(($state & D2) >0){
    
    echo "<br />灯2是亮的";
}else
{
    echo "<br />灯2是灭的";
}

//写出方法,展示所有灯的整体显示
function ShowAll()
{
    echo "<p>";
    for($i=1;$i<=5;++$i)
    {
        $s = "D".$i;
        if(($GLOBALS['state'] & constant($s)) > 0)
        {
            echo "灯{$i}是亮的<br />";
        }else
        {
            echo "灯{$i}是灭的<br />";
        }
    }
    echo "</p>";
}
echo "<br />初始多有灯的状态:";
ShowAll();

//需求2,可以打开指定的任意一个灯泡
//也只要按照如下算法就可以打开:
//$state = $state |对应灯的常量值:

//需求2a:请打开灯3
$state = $state | D3;
echo "<br />灯3打开后:";
ShowAll();

//需求2b:请打开灯5:
$state = $state | D5;
echo "<br />灯5打开后:";
ShowAll();

//需求3,可以关闭指定的任意一个灯泡
//也只要按照如下算法就可以打开:
//$state = $state & (~对应灯的常量值):

//需求3a:请关闭灯2
$state = $state & (~D3);
echo "<br />灯3关闭后:";
ShowAll();

//需求3b:请关闭灯5
$state = $state & (~D5);
echo "<br />灯5关闭后:";
ShowAll();

//需求3c:请关闭灯1(其实该登本来就是关闭的)
$state = $state & (~D1);
echo "<br />灯1关闭后:";
ShowAll();

 

 

 

 

  

转载于:https://www.cnblogs.com/xlju/p/8515778.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值