计算给定位数的最大值
我有一个函数,它需要接收任意数量的位数,比如说7位。有没有简单的方法可以计算出用这些位数能表示的最大数字?比如,如果我传入8位,这个函数应该返回255。
有没有简单又高效的方法来做到这一点呢?
2 个回答
8
把数字1向左移动指定的位数,然后减去1:
def max_bits(b):
return (1 << b) - 1
示例:
>>> max_bits(8)
255
>>> max_bits(256)
115792089237316195423570985008687907853269984665640564039457584007913129639935L
位移操作比用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倍!
5
你可以这样做(我觉得这个方法很简单而且高效):
def max_bits(b):
return (2 ** b) - 1
示例:
>>> max_bits(8)
255
这个方法有效是因为二进制的位值总是2的幂,所以这可能是最简单、最容易理解的方式。