2015-06-14 14 views
6

Sto creando un semplice sistema di parentesi e ho bisogno di un modo per verificare se ci sono un numero corretto di squadre, OPPURE se il mio programma ha bisogno di compensare i ciao round.Determinazione dei poteri di 2?

In questo momento, sto controllando per "potenze di due" con questa funzione:

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

Questo funziona abbastanza bene, ma Sto dovendo sapere quanti Bye arrotonda da aggiungere. Ad esempio, se avessi 16 teams, non avrei bisogno di aggiungere più squadre. Tuttavia, se avessi 12 teams, mi occorrerebbe il primo 4 teams per ricevere un bye round.

Come è possibile calcolare il numero di round di addio da aggiungere alla staffa? E sarebbe difficile codificare una serie di poteri di due?

In pseudo-codice, qualcosa di simile a questo è quello che pensavo:

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

NOTA: avrei preferito non utilizzare una vasta gamma di potenze di due, come di seguito:

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

Il ragionamento dietro questo è che limiterei il numero di squadre che potrebbero essere messe nel sistema (tuttavia, non penso che una persona avrebbe più di 256 squadre).

+2

calcolare la successiva potenza di 2 [qui] (http://stackoverflow.com/questions/1322510/given-an-integer-how- do-i-find-the-next-largest-power-of-two-using-bit-twiddlin) e sottrarre dal tuo intero corrente – Drakes

+0

@Drakes Grazie, guarda male! –

+4

Motivo del downvote? –

risposta

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

Soluzione più generalizzato per casi estremi:

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

Soluzione molto saggia. –

+0

Molto semplicistico. Invece della mia prima funzione, posso controllare se restituisce '0', quindi è una parentesi perfetta. Grazie! –

+0

Non che ciò sia importante in questo particolare contesto ma questa logica binaria ha un limite superiore. Questo si interrompe se '' n> Math.pow (2, 30) ''. –

Problemi correlati