Определение полномочий 2?
Я создаю простую брекет-систему, и мне нужен способ проверить, есть ли правильное количество команд, или если моя программа должна компенсировать прощальные раунды.
прямо сейчас я проверяю "полномочия двух" с помощью этой функции:
function validBracket(data) {
var x = data.teams.length;
return ((x != 0) && !(x & (x - 1)));
}
это работает довольно хорошо, но мне нужно знать, сколько прощальных раундов добавить.
Например, если бы я ... --2-->, мне не нужно было бы добавлять больше команд. Впрочем, если бы я ... --3-->, мне понадобится первый 4 teams
получить пока круглые.
как я могу рассчитать количество прощальных раундов, чтобы добавить к моей скобке? И будет ли жесткое кодирование массива степеней двух лучше?
в псевдо-коде, что-то вроде этого, о чем я думал:
if(validateBracket(data)) {
// Valid number of teams (power of two). Keep going.
} else {
var byeRounds = calculateByeRounds();
}
Примечание: я бы предпочел не использовать массив полномочия двух, как показано ниже:
var powersOfTwo = [2,4,8,16,32,...];
причина в том, что я буду ограничивать количество команд, которые могут быть положены в система (однако я не думаю, что у человека будет более 256 команд).
1 ответов
var needed = (1 << Math.ceil(Math.log2(n))) - n;
более обобщенное решение для экстремальных случаев:
var needed = Math.pow(2, Math.ceil(Math.log2(n))) - n;