Допустим, у меня есть перечисление, которое используется для флагов, т.е.C++ Получить побитовый сдвиг от Enum Value
enum Flags { Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2 };
Если я даюсь значением Flags
, я хотел бы знать, что битое сдвига значения является. По существу, для Flag1
Я хотел бы вернуть 0, для Flag2
Я хотел бы вернуть 1 и т. Д. Может ли кто-нибудь подумать о том, как это сделать, кроме использования функции с оператором switch
.
Я хочу этого, потому что у меня есть массив данных, а возвращаемое значение функции является одним из элементов этого массива. Какой элемент для возврата зависит от того, какой флаг передан функции.
Я хотел бы получить более краткий способ сделать следующее. Особенно, если я изменяю перечисление, мне не нужно возвращаться и изменять эту функцию.
myobj* objects[3] = { obj1, obj2, obj3 };
myobj* GetObj(Flags FlagValue)
{
switch(FlagValue)
{
case Flag1:
return objects[0];
case Flag2:
return objects[1];
case Flag3:
return objects[2];
}
}
Я поселился на '_BitScanReverse'. Кажется, это самая краткая и лучшая производительность. Поскольку это то, что потенциально называют часто, мне нравится метод без циклов. Даже если внутри '_BitScanReverse' есть цикл, он, вероятно, оптимизирован лучше, чем я пишу цикл while с проверкой ошибок. –