我有一個函數需要傳遞任意數量的比特,例如7.是否有一種直接的方式來計算具有該比特數的最大數量。例如,如果我通過8,功能將返回255.根據給定的比特數計算最大值
有沒有一種簡單/有效的方法來做到這一點?
我有一個函數需要傳遞任意數量的比特,例如7.是否有一種直接的方式來計算具有該比特數的最大數量。例如,如果我通過8,功能將返回255.根據給定的比特數計算最大值
有沒有一種簡單/有效的方法來做到這一點?
你可以只是做(我會說這是非常簡單而有效):
def max_bits(b):
return (2 ** b) - 1
演示:
>>> max_bits(8)
255
這工作,因爲二進制的位值始終的指數2,所以這可能是最簡單和最容易理解的。
需要減去1的最大值 – TyrantWave
@TyrantWave謝謝,編輯。 –
左移由比特數的數字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倍以上!
不成熟的優化。 –
@ErikAllik:爲什麼這是過早的優化?我只是碰巧用更有效的方法知道這一點;它並不像其他選項更易讀或更容易維護。 –
@ErikAllik:當人們*需要優化他們的代碼時,人們還會去發現使用什麼方法?當你在某個關鍵循環中創建一個位掩碼時,5倍的速度差異可能會產生巨大的差異。這是一個堆棧溢出的答案,很可能會保留下來,並被未來幾年的許多人用作參考,這樣的信息對於*優化的人很重要。 –
'(2 ** n)-1'快速給出最大值 – TyrantWave