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

5
我知道这是可能的,只是我不知道它叫什么,而且谷歌也没有提供太多帮助。
假设您有4个选项可供选择:A、B、C和D。如果用户选择A和C,则可以将选择保存为5(即0101),如果用户选择D,则保存为8(即1000)。
我的问题是,如何在保存后将5转换回A=1,B=0,C=1,D=0?
我试图保存电影年龄限制,并认为这可能是最好的方法。

我会想到一个包含所有值的表格,并进行查找。问题是,为什么你要用二进制方式来做呢? - HamZa
我正在寻找一种简单的方法来存储所有不同年龄限制的选择,因为有相当多的选择,我记得几年前有一个程序员告诉过我这种方法,我很想尝试一下并看看是否能让它工作。不确定现在是否有更简单/更好的方法来实现? - Xethron
1
我在 Stack Overflow 上看到过这个问题,但是找不到了。不过我找到了这个答案和这个答案,它们看起来很有趣。其中一个是关于 PHP 中位运算的,另一个是关于使用位运算符在 C++/PHP 中存储设置的。 - HamZa
3个回答

5
我相信术语是BCD(二进制编码十进制)。
以下是在您的情况下如何实现它: 1. 创建4个变量(或常量),代表4种可能的选择,并设置它们的值如下: $ A = 1; $ B = 2; $ C = 4; $ 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;

是的,但我该如何再次检索它? - Xethron
1
那么,你的意思是最终得到一个值为 5 的例子,并将其存储在某个地方。稍后,您读回 5 并想将其转换回选项? - Kevin Fegan
更新了问题。对此感到抱歉 :) - Xethron
1
@Xethron - 我更新了答案,展示如何除了**True|False之外,返回值0|1**。 - Kevin Fegan

1
你可以使用 位运算。基本上,通过对两个或多个数字进行按位 OR运算来实现效果,然后通过对要测试的数字进行按位 AND运算来检查是否存在OR运算出的数字。

示例:

您希望用户选择他们精通的语言。您向他们提供的选项是英语、德语、俄语和西班牙语。
首先,从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

希望能有所帮助。

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"

(还有许多 PHP 的替代方法可以将整数转换为布尔值,例如:$A = (boolean)($i&1); $B = (boolean)($i&2); $C = (boolean)($i&4); $D = (boolean)($i&8); - Stano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接