使用二进制将选择存储为整数

时间:2013-05-11 12:44:14

标签: php binary

我知道这是可能的,我只是不知道它叫什么,谷歌没有太多的帮助。

假设您有4个选项可供选择,A,B,C和D.如果用户选择A和C,您可以简单地将选择保存为5 = 0101,如果用户选择D则为8(1000 )。

我的问题是,在保存之后你将如何将5转换回A = 1,B = 0,C = 1,D = 0?

我正在努力保存电影“年龄限制”,并认为这可能是最好的方法。

3 个答案:

答案 0 :(得分:4)

我认为该术语是BCD(二进制编码十进制)。

以下是如何在您的情况下实施它:

  1. 创建代表4种可能选择的4个变量(或常量),并设置它们的值如下:

      

    $ A = 1;
         $ B = 2;
         $ C = 4;
         $ D = 8;

  2. 然后,对于A,B,C和D中的每个选项,添加相关变量的值。

  3. 在您存储了该组合值之后,稍后您将其读回来,并且您想要从存储的值中解码选择...

    为此,您使用 & 运算符(按位 AND )。例如,假设您存储并读回名为 $Answer 的变量的值为 5

    Answer 解码为以下选项:

    $intChoiceA = ($Answer & 1);
    $intChoiceB = ($Answer & 2);
    $intChoiceC = ($Answer & 4);
    $intChoiceD = ($Answer & 8);
    

    要选择 True|False ,您可以这样做:

    $bChoiceA = ($Answer & 1) > 0;
    $bChoiceB = ($Answer & 2) > 0;
    $bChoiceC = ($Answer & 4) > 0;
    $bChoiceD = ($Answer & 8) > 0;
    

    要选择 0|1 ,您可以这样做(使用PHP Ternary Operator

    $intChoiceA = (($Answer & 1) > 0) ? 1 : 0;
    $intChoiceB = (($Answer & 2) > 0) ? 1 : 0;
    $intChoiceC = (($Answer & 4) > 0) ? 1 : 0;
    $intChoiceD = (($Answer & 8) > 0) ? 1 : 0;
    

答案 1 :(得分:1)

使用bitwise operators in PHP可以这样做:

$A = 1;
$B = 0;
$C = 1;
$D = 0; // input data

$i = $A | ($B<<1) | ($C<<2) | ($D<<3); // joined in one integer

// echo str_pad(decbin($i),4,'0',STR_PAD_LEFT); // bit test ok: 0101 ~ $D$C$B$A

// back conversion:
$A = $i&1;
$B = ($i&2) >>1;
$C = ($i&4) >>2;
$D = ($i&8) >>3;
echo "$A $B $C $D"; // prints "1 0 1 0"

答案 2 :(得分:1)

您可以使用bitwise operations。基本上,您通过对两个或多个数字执行按位OR来实现效果,然后通过对要测试的数字执行按位AND来检查数字是否已被“运算”

实施例

您希望用户选择他们流利的语言。您提供的选项是英语,德语,俄语和西班牙语。
首先,首先定义权力为2的选项:

$LANGUAGE_ENGLISH = 2;
$LANGUAGE_RUSSIAN = 4;
$LANGUAGE_GERMAN = 8;
$LANGUAGE_SPANISH = 16;

假设用户选择英语和俄语。您可以按如下方式组合选项:

$selected_options = 0; // we'll store the result in here
$selected_options = $LANGUAGE_ENGLISH | $LANGUAGE_RUSSIAN;
//It can also be express as:
//$selected_options |= $LANGUAGE_ENGLISH;
//$selected_options |= $LANGUAGE_RUSSIAN;


$selected_options变量现在包含我们用户的选项。要检查是否存储了选项,请执行按位AND。如果结果为0,则不存储该值。否则,存储该值 例如:

if ($selected_options & $LANGUAGE_ENGLISH != 0)
    echo "English was selected";
else
    echo "English was NOT selected";

要求:

所有数字都需要有非重叠位。防止重叠的最简单方法是仅使用2的幂数。例如,在下表中,32重叠,不能与2一起使用。但是,124不重叠,因此可以与两者一起使用。

1: 0001
2: 0010
3: 0011
4: 0100

希望有所帮助