Определение полномочий 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;