2011-04-02 66 views
3
public int CalcBrackets(int teamCount) 
    { 
     int positions = 1; 

     while (positions < teamCount) 
      positions *= 2; 

     return positions; 
    } 

我想要得到2的冪的最小數,並且大於或等於teamCount。這真的是最好的方式嗎?它看起來很可怕:(C#數學問題:2的最小冪比X大嗎?

+0

你的代碼返回最小的* power * 2.這就是你想要的,還是你在最小倍數之後? – YXD 2011-04-02 18:53:02

+0

哎呀,意味着最小的力量。 – bevacqua 2011-04-02 18:59:51

回答

10

如果你需要計算2(而不是倍數)最小的那麼小於那麼teamCount,那麼這可能是最好的方法。以對數爲代價是一個代價高昂的操作,可能需要更多的時間,然後進行一個簡單的循環。

UPD 下面是一個算法使用按位運算(C++)(http://aggregate.org/MAGIC/,部分下一個最大的2的冪)

unsigned int nlpo2(unsigned int x) 
{ 
    x--; // comment out to always take the next biggest power of two, even if x is already a power of two 
    x |= (x >> 1); 
    x |= (x >> 2); 
    x |= (x >> 4); 
    x |= (x >> 8); 
    x |= (x >> 16); 
    return (x+1); 
} 

首先,它設置的所有相關數字的位數爲1(例如,0x3ff),然後遞增(0x400)以獲得2的冪。

+1

這裏有一個bug,在x已經是2的冪的情況下,它會返回x << 1,這可能現在是用戶想要的......你需要先在x之前做一個x--函數聲明... – damageboy 2011-04-06 13:54:40

+0

對於x = 0,它將返回0,這不是2的冪! – Gerrit 2014-05-26 08:09:16

1

最小多個

return (teamCount % 2 == 0 ? teamCount : teamCount + 1); 

最小功率,你可以把日誌。喜歡的東西

2 ** (ceil(log_2(teamCount))) 

有關合適的小區和log_2功能。你的技巧儘管如此,

+2

這不是真正的C#代碼。 – 2016-03-09 11:06:58

0

這種方式很簡單:

if (teamCount % 2 == 0) 
    return teamCount; 
else 
    return (teamCount + 1); 
1

while循環不會超過2的倍數,而是2的冪。

如果妳確實需要多隻加1除以2得到半部分,然後乘以二回:

return ((teamCount+1)/2)*2 

所以,如果是即使如此,你獲得背面,同樣nuber,而如果它很奇怪,因爲你加1然後分開,你會得到下一個偶數。

0

不小得多,如果你的意思是多個2 * 2 * 2 * 2 * log aritm最好的方法是在基數2中使用logaritma函數,並將結果舍入爲低基數。也就是說,如果團隊數等於35 log 2 base 35給你5,xxx將它舍入爲5.