所以我有一个问题,我需要帮助找到解决方案。问题是我获得了各种车型和功能的各种选项代码:
选择颜色
我的问题是,鉴于各种编码限制,我会获得一个功能,用户可以选择他们想要的特定颜色的汽车,但他们只能输入一个选项代码
例如。 如果用户想要一辆红色(32)的福特(1)他们将输入33。
所以我的问题是什么是好的/最好的锻炼方式基于发送到函数的选项代码选择了哪些选项,所有选项都增加了2的幂。所以从33我需要得到回到1和32。
答案 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的幂。你仍然需要将它们掩盖掉,如上所示,但它会阻止你获得互斥的组合,如果那样的话。 ;不是你想要的。