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


Using Binary to store a selection as integer

我知道这是可能的,我只是不知道它叫什么,谷歌也没帮上什么忙。

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

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

我想保存电影的年龄限制,并认为这可能是最好的方法。

我相信这个术语是BCD(二进制编码十进制)。

在你的情况下,你可以这样做:

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

    $A = 1;$B = 2;
    $ d = 8;

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

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

要做到这一点,您可以使用 & 运算符(按位 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三元操作符: )
$intChoiceA = (($Answer & 1) > 0) ? 1 : 0;
$intChoiceB = (($Answer & 2) > 0) ? 1 : 0;
$intChoiceC = (($Answer & 4) > 0) ? 1 : 0;
$intChoiceD = (($Answer & 8) > 0) ? 1 : 0;

通过在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为幂的选项:

$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变量现在包含了用户的选项。要检查是否存储了一个选项,可以执行位与操作。如果结果为0,则没有存储该值。否则,存储该值。
例子:

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

要求:

所有的数字需要有不重叠的位。防止重叠的最简单方法是只使用2的幂数。例如,在下表中,32重叠,不能与2一起使用。然而,1不与24重叠,因此可以同时用于两者。

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

希望有帮助