计算给定位数的最大值

2 投票
2 回答
9995 浏览
提问于 2025-04-18 03:00

我有一个函数,它需要接收任意数量的位数,比如说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的幂,所以这可能是最简单、最容易理解的方式。

撰写回答