2015-06-14 6 views
6

मैं एक साधारण ब्रैकेट सिस्टम बना रहा हूं और मुझे यह जांचने का एक तरीका चाहिए कि टीमों की सही संख्या है या नहीं, या यदि मेरे कार्यक्रम को अलविदा दौरों की भरपाई करने की आवश्यकता है।2 की शक्तियों का निर्धारण?

अभी, मैं इस समारोह के साथ "दो की शक्तियों के लिए" जाँच कर रहा हूँ:

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

यह बहुत अच्छी तरह से काम करता है, लेकिन मुझे पता है कि कितने अलविदा जोड़ने के लिए की आवश्यकता होगी, राउंड कर रहा हूँ। उदाहरण के लिए, यदि मेरे पास 16 teams था, तो मुझे अब और टीमों को जोड़ने की आवश्यकता नहीं होगी। हालांकि, अगर मेरे पास 12 teams था, तो मुझे अलविदा दौर प्राप्त करने के लिए पहले 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 से अधिक टीमें होंगी)।

+2

[यहां] के 2 अगले शक्ति की गणना (http://stackoverflow.com/questions/1322510/given-an-integer-how- डू-आई-ढूंढ-द-अगली-सबसे बड़ी-शक्ति-दो-उपयोग-बिट-ट्विडलिन) और अपने वर्तमान पूर्णांक से घटाएं – Drakes

+0

@ धन्यवाद धन्यवाद, बीमार इसे देखें! –

+4

डाउनवोट के कारण? –

उत्तर

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

चरम मामलों के लिए अधिक सामान्यीकृत समाधान:

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

बहुत बुद्धिमान समाधान। –

+0

बहुत सरल है। मेरे पहले कार्य के बजाय, मैं जांच सकता हूं कि यह '0' लौटाता है तो यह एक सही ब्रैकेट है। धन्यवाद! –

+0

यह नहीं कि यह इस विशेष संदर्भ में महत्वपूर्ण है लेकिन इस बाइनरी तर्क की ऊपरी सीमा है। यह तोड़ता है अगर 'n> Math.pow (2, 30)' '। –

संबंधित मुद्दे