2017-03-17 55 views
0

所以我有一个问题,我需要帮助找到解决方案。问题在于,我给出了各种车型和特征的各种选项代码:使用单个数字来表示多个变量

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

随着选择的颜色

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

我的问题是在给定各种编码限制的情况下,给予我一个功能,用户可以选择他们想要的特定颜色的汽车,但他们只能输入一个选项代码。 如果用户想要一辆福特(1)即红色(32),他们会输入33.

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

+0

所以,如果他们进入239,他们得到一辆汽车,是福特,雪铁龙,日产(?) *和*特斯拉,在红色,蓝色和黑色的配色方案?无论如何,你可以使用按位AND来测试每一位......所以'options&1!= 0'表示它是福特等。 – Dmitri

+0

换句话说:不好的方法开始。 –

回答

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; 
// ... 

请注意,这并不妨碍有人选择了福特+雪铁龙红+蓝,你必须以某种方式进行验证(无论是在这里,或之前,最好[R ight使用户输入 - 例如具有仅允许一个变体的选择框)。

0

您可以使用位掩码。例如,如果模型的代码是31以下,那么你可以说:

int car = code & 31; 

为了获得颜色,你只会转移代码右5位:

int color = code >> 5; 

你挑选的权力2,但这只有在你想将值合并到代码中时才有用。例如,当您为汽车和颜色做的时候,您的解决方案还允许代码包含福特和日产。如果你不想这样做,那么改变它们的值,使它们不是2的幂。如上所示,你仍然需要掩盖它们,但是如果这不是你想要的,它会阻止你获得相互排斥的组合。

2

您需要口罩,以提取信息:

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

现在可以提取:

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