2015-06-14 15 views
6

Tôi đang tạo một hệ thống khung đơn giản và tôi cần một cách để kiểm tra xem có đúng số đội hay không, HOẶC nếu chương trình của tôi cần đền bù cho các vòng tạm biệt.Xác định Quyền hạn của 2?

Ngay bây giờ, tôi đang kiểm tra cho "quyền hạn của hai" với chức năng này:

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

này hoạt động khá tốt, nhưng tôi cần phải biết có bao nhiêu Bye vòng thêm. Ví dụ: nếu tôi có 16 teams, tôi sẽ không cần phải thêm các nhóm nữa. Tuy nhiên, nếu tôi có 12 teams, tôi sẽ cần 4 teams đầu tiên để nhận được một vòng bye.

Làm cách nào để tính số vòng bye để thêm vào khung của tôi? Và sẽ khó mã hóa một loạt các quyền hạn của hai được tốt hơn?

Trong mã giả, một cái gì đó như thế này là những gì tôi đã nghĩ đến việc:

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

LƯU Ý: Tôi không muốn sử dụng một loạt các quyền hạn của hai như dưới đây:

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

Lý do đằng sau điều này là tôi sẽ giới hạn số lượng đội có thể được đưa vào hệ thống (tuy nhiên, tôi không nghĩ rằng một người sẽ có hơn 256 đội).

+2

Tính sức mạnh tiếp theo của 2 [ở đây] (http://stackoverflow.com/questions/1322510/given-an-integer-how- do-i-find-the-next-lớn nhất-power-of-hai-sử dụng-bit-twiddlin) và trừ từ số nguyên hiện tại của bạn – Drakes

+0

@Drakes Cảm ơn, bệnh hãy nhìn vào nó! –

+4

Lý do cho downvote? –

Trả lời

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

giải pháp More tổng quát đối với trường hợp cực đoan:

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

Giải pháp rất khôn ngoan. –

+0

Rất đơn giản. Thay vì hàm đầu tiên của tôi, tôi có thể kiểm tra nếu điều này trả về '0' thì đó là một khung hoàn hảo. Cảm ơn! –

+0

Không phải là điều này quan trọng trong bối cảnh cụ thể này nhưng logic nhị phân này có ranh giới trên. Điều này vi phạm nếu '' n> Math.pow (2, 30) ''. –

Các vấn đề liên quan