2014-04-16 86 views
0

我有一個函數需要傳遞任意數量的比特,例如7.是否有一種直接的方式來計算具有該比特數的最大數量。例如,如果我通過8,功能將返回255.根據給定的比特數計算最大值

有沒有一種簡單/有效的方法來做到這一點?

+0

'(2 ** n)-1'快速給出最大值 – TyrantWave

回答

5

你可以只是做(我會說這是非常簡單而有效):

def max_bits(b): 
    return (2 ** b) - 1 

演示:

>>> max_bits(8) 
255 

這工作,因爲二進制的位值始終的指數2,所以這可能是最簡單和最容易理解的。

+0

需要減去1的最大值 – TyrantWave

+0

@TyrantWave謝謝,編輯。 –

4

左移由比特數的數字1,減去一個:

def max_bits(b): 
    return (1 << b) - 1 

演示:

>>> max_bits(8) 
255 
>>> max_bits(256) 
115792089237316195423570985008687907853269984665640564039457584007913129639935L 

Bitshifting比使用的2的指數更快:

>>> import timeit 
>>> def max_bits_bitshift(b): 
...  return (1 << b) - 1 
... 
>>> def max_bits_exp(b): 
...  return (2 ** b) - 1 
... 
>>> timeit.timeit('f(256)', 'from __main__ import max_bits_exp as f') 
2.767354965209961 
>>> timeit.timeit('f(256)', 'from __main__ import max_bits_bitshift as f') 
0.49823594093322754 

這比256位數字快5倍以上!

+0

不成熟的優化。 –

+0

@ErikAllik:爲什麼這是過早的優化?我只是碰巧用更有效的方法知道這一點;它並不像其他選項更易讀或更容易維護。 –

+0

@ErikAllik:當人們*需要優化他們的代碼時,人們還會去發現使用什麼方法?當你在某個關鍵循環中創建一個位掩碼時,5倍的速度差異可能會產生巨大的差異。這是一個堆棧溢出的答案,很可能會保留下來,並被未來幾年的許多人用作參考,這樣的信息對於*優化的人很重要。 –