Вычисление флагового бита и обнаружение

В некотором коде я продолжаю работать, я должен заботиться о десяти независимых параметрах, которые могут принять одно из двух значений (0 или 1). Это создает 2^10 отличные условия. Некоторые условия никогда не происходят и могут быть не учтены, но те, которые действительно происходят, все еще МНОГО и делающий a switch обработать все случаи безумно.

Я хочу использовать 10 if операторы вместо огромного switch. Для этого я знаю, что должен использовать флаговые биты или скорее отметить байты, поскольку языком является JavaScript и его более легкое для работы с 10 строками байтов с представить 10-разрядный двоичный файл.

Теперь, моя проблема, я не знаю, как реализовать это. Я видел используемый в APIs, где несколько - выбираемые опции подвергаются с номерами 1, 2, 4, 8..., n^ (n-1), которые являются десятичными эквивалентами 1, 10, 100, 1000, и т.д. в двоичном файле. Таким образом, если мы выполняем вызов как bar = foo(7), панель будет объектом с любыми опциями, которые включают три самых правых флага.

Я могу преобразовать десятичное число в двоичный файл и в каждом if проверка оператора, чтобы видеть, установлена ли соответствующая цифра или нет. Но интересно, там способ определить n-th цифра десятичного числа является нулем или один в двоичной форме, на самом деле не делая преобразования?

5
задан Oded 25 April 2010 в 07:20
поделиться

3 ответа

Просто используйте побитовое и. В 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.
    }
}
6
ответ дан 14 December 2019 в 01:04
поделиться

Вы можете использовать побитовое и:

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
2
ответ дан 14 December 2019 в 01:04
поделиться

Вы можете получить число с установленным n-м битом и И его с вашим числом. Если результат равен нулю, в вашем номере не установлен бит. В противном случае так и было. Смотрите также здесь .

1
ответ дан 14 December 2019 в 01:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: