2015-06-14 13 views
6

Tworzę prosty system nawiasów i potrzebuję sposobu sprawdzenia, czy istnieje odpowiednia liczba drużyn, lub czy mój program musi zrekompensować rundy bye.Ustalanie uprawnień 2?

Teraz jestem sprawdzanie „potęgi dwójki” Dzięki tej funkcji:

function validBracket(data) { 
    var x = data.teams.length; 
    return ((x != 0) && !(x & (x - 1))); 
} 

To działa całkiem dobrze, ale mam potrzeby wiedzieć, ile Bye zaokrągla dodać. Na przykład, gdybym miał 16 teams, nie musiałbym dodawać więcej zespołów. Jednakże, gdybym miał 12 teams, potrzebowałbym pierwszego 4 teams, aby uzyskać rundę bye.

Jak mogę obliczyć liczbę rund bye dodać do mojego nawiasu? I czy trudne kodowanie zestawu mocy dwójki byłoby lepsze?

W pseudo kod, coś w tym jest to, co miał na myśli:

if(validateBracket(data)) { 
    // Valid number of teams (power of two). Keep going. 
} else { 
    var byeRounds = calculateByeRounds(); 
} 

UWAGA: wolałbym nie używać tablicę potęgi dwójki jak poniżej:

var powersOfTwo = [2,4,8,16,32,...];

Powodem tego jest to, że ograniczyłbym liczbę drużyn, które można umieścić w systemie (nie sądzę jednak, że dana osoba ma ponad 256 zespołów).

+2

obliczyć moc następny 2 [o] (http://stackoverflow.com/questions/1322510/given-an-integer-how- do-i-find-the-next-largest-power-of-two-using-bit-twiddlin) i odejmij od twojej aktualnej liczby całkowitej – Drakes

+0

@Drakes Dzięki, chory, spójrz na to! –

+4

Powód spadkowy? –

Odpowiedz

10
var needed = (1 << Math.ceil(Math.log2(n))) - n; 

bardziej ogólne rozwiązanie ekstremalnych przypadkach:

var needed = Math.pow(2, Math.ceil(Math.log2(n))) - n; 
+0

Bardzo mądre rozwiązanie. –

+0

Bardzo uproszczone. Zamiast mojej pierwszej funkcji, mogę sprawdzić, czy to zwraca '0', to jest idealny nawias. Dzięki! –

+0

Nie ma to znaczenia w tym szczególnym kontekście, ale ta logika binarna ma górną granicę. Dzieje się to, gdy '' n> Math.pow (2, 30) ''. –