3

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

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

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

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

4

3 回答 3

4

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

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

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

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

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

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

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

要解码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;
于 2013-05-11T12:56:25.457 回答
1

您可以使用按位运算本质上,您可以通过对两个或多个数字进行按位OR来实现效果,然后通过对要测试的数字进行按位与来检查一个数字是否被 OR'ed。

例子:

您希望用户选择他们精通的语言。您向他们提供的选项是英语、德语、俄语和西班牙语。
首先,首先定义 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 的幂数。例如,在下表中,3与 重叠2,不能与 一起使用21但是,不与2or重叠4,因此可以与两者一起使用。

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

希望有帮助

于 2013-08-05T11:55:10.713 回答
1

通过在 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"
于 2013-05-11T13:16:06.577 回答