Ваши комбинации параметров - это не более чем двоичное число (например, 01100
), где 0
обозначает false
и 1
a true
.
Так что ваша версия можетбыть легко рассчитанным с использованием всех комбинаций единиц и нулей.Возможные комбинации с 2 входными параметрами:
11
-> оба true
10
-> первое true
, второе false
01
-> первое false
, второе true
00
-> оба false
Так что с этим знаниемЯ придумал довольно масштабируемое решение, использующее «битовую маску» (не более чем число) и «битовые операции»:
public static int getVersion(boolean... params) {
int length = params.length;
int mask = (1 << length) - 1;
for(int i = 0; i < length; i++) {
if(!params[i]) {
mask &= ~(1 << length - i - 1);
}
}
return mask + 1;
}
Наиболее интересная строка, вероятно, такая:
mask &= ~(1 << length - i - 1);
Он делает много вещей одновременно, я разделил это.Часть length - i - 1
вычисляет положение «бита» внутри битовой маски справа (на основе 0
, как в массивах).
Следующая часть: 1 << (length - i - 1)
сдвигает число 1
количество позиций слева.Допустим, у нас есть позиция 3, тогда результатом операции 1 << 2
(2
- третья позиция) будет двоичное число со значением 100
.
~
знак является двоичным обратным, поэтому все биты инвертированы, все 0
обращены в 1
и все 1
превращены в 0
.В предыдущем примере обратное значение 100
было бы 011
.
Последняя часть: mask &= n
такая же, как mask = mask & n
, где n
- это ранее вычисленное значение 011
.Это не что иное, как двоичное И, поэтому все те же биты, которые находятся в mask
и в n
, сохраняются там, где все остальные отбрасываются.
В общем, эта единственная строка не делает ничего, кроме удаления «бита» в заданной позиции mask
, если входной параметр равен false
.
Еслиномера версий не последовательны от 1
до 4
, тогда вам может помочь таблица поиска версий, например эта .
Весь код может потребоваться всего лишь одна настройка впоследняя строка:
return VERSIONS[mask];
Где ваш массив VERSIONS
состоит из всех версий по порядку, но в обратном порядке.(индекс 0
из VERSIONS
, где оба параметра имеют значение false)