2014-04-16 49 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倍的速度差异可能会产生巨大的差异。这是一个堆栈溢出的答案,很可能会保留下来,并被未来几年的许多人用作参考,这样的信息对于*优化的人很重要。 –