我有一个函数需要传递任意数量的比特,例如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