В некотором коде я продолжаю работать, я должен заботиться о десяти независимых параметрах, которые могут принять одно из двух значений (0 или 1). Это создает 2^10 отличные условия. Некоторые условия никогда не происходят и могут быть не учтены, но те, которые действительно происходят, все еще МНОГО и делающий a switch
обработать все случаи безумно.
Я хочу использовать 10 if
операторы вместо огромного switch
. Для этого я знаю, что должен использовать флаговые биты или скорее отметить байты, поскольку языком является JavaScript и его более легкое для работы с 10 строками байтов с представить 10-разрядный двоичный файл.
Теперь, моя проблема, я не знаю, как реализовать это. Я видел используемый в API
s, где несколько - выбираемые опции подвергаются с номерами 1, 2, 4, 8..., n^ (n-1), которые являются десятичными эквивалентами 1, 10, 100, 1000, и т.д. в двоичном файле. Таким образом, если мы выполняем вызов как bar = foo(7)
, панель будет объектом с любыми опциями, которые включают три самых правых флага.
Я могу преобразовать десятичное число в двоичный файл и в каждом if
проверка оператора, чтобы видеть, установлена ли соответствующая цифра или нет. Но интересно, там способ определить n-th
цифра десятичного числа является нулем или один в двоичной форме, на самом деле не делая преобразования?
Просто используйте побитовое и. В C / C ++ это будет:
if (flags & 1) {
// Bit zero is set.
}
if (flags & 2) {
// Bit one is set.
}
if (flags & 4) {
// Bit two is set.
}
...
Для удобства использования используйте символические имена для масок флагов вместо магических чисел, 1, 2, 4, 8 и т. Д.
Если флаги в некотором роде однородны (например, они представляют десять пространственных измерений в некоторых геометрических задачах), и код для обработки каждого случая одинаков, вы можете использовать цикл:
for (int f = 0; f < 10; ++f) {
if (flags & (1 << f)) {
// Bit f is set.
}
}
Вы можете использовать побитовое и:
10 & 2^1 is true because 10 = 1010b
^ 1
8 & 2^1 is false because 8 = 1000b
^ 0
10 & 2^3 is true because 10 = 1010b
^ 1
Вы можете получить число с установленным n-м битом и И его с вашим числом. Если результат равен нулю, в вашем номере не установлен бит. В противном случае так и было. Смотрите также здесь .