使用单个数字表示多个变量

时间:2017-03-17 16:55:44

标签: c++ oop

所以我有一个问题,我需要帮助找到解决方案。问题是我获得了各种车型和功能的各种选项代码:

  • 汽车:福特:选项代码:1
  • Car:Citron:选项代码:2
  • 汽车:日产:选项代码:4
  • 汽车:特斯拉:选项代码:8

选择颜色

  • 颜色:红色:选项代码:32
  • 颜色:蓝色:选项代码:64
  • 颜色:黑色:选项代码:128

我的问题是,鉴于各种编码限制,我会获得一个功能,用户可以选择他们想要的特定颜色的汽车,但他们只能输入一个选项代码

例如。 如果用户想要一辆红色(32)的福特(1)他们将输入33。

所以我的问题是什么是好的/最好的锻炼方式基于发送到函数的选项代码选择了哪些选项,所有选项都增加了2的幂。所以从33我需要得到回到1和32。

3 个答案:

答案 0 :(得分:2)

您需要掩码来提取该信息:

const unsigned modelMask = FordCode | CitronCode | NissanCode | TeslaCode ...;
const unsigned colorMask = RedCode | BlueCode ...;

现在你可以提取:

unsigned model = value & modelMask;
unsigned color = value & colorMask;

答案 1 :(得分:0)

在这种情况下,我通常使用二进制"和"运算符,例如:

if (code & OPTION_CAR_FORD)
    cout << "Ford selected" << endl;
if (code & OPTION_CAR_CITROEN)
    cout << "Citroen selected" << endl;
// ...
if (code & OPTION_COLOR_RED)
    cout << "Red color selected" << endl;
// ...

请注意,这并不能阻止有人选择福特+雪铁龙Red + Blue,你必须以某种方式进行验证(在这里或之前,理想情况下是在用户输入的正确位置 - 例如,选择框只允许一个变体)

答案 2 :(得分:0)

您可以使用bitmasking。例如,如果型号代码是31或更少,那么您可以说:

int car = code & 31;

要获得颜色,您只需将代码右移5个位置:

int color = code >> 5;

您已经选择了2的幂,但这仅在您想要将值组合到代码中时才有用。虽然您可以使用汽车和颜色,但您的解决方案还允许代码包含福特和日产。如果你不想要这个,那么改变这些值,使它们不是2的幂。你仍然需要将它们掩盖掉,如上所示,但它会阻止你获得互斥的组合,如果那样的话。 ;不是你想要的。