Python 根据给定的位数计算可能的最大值
我有一个需要传递任意位数的函数,例如7。是否有一种straitforward方法来计算该位数的最大可用位数。例如,如果我传入8,函数将返回255 有没有一种简单/有效的方法可以做到这一点 你可以这样做(我认为这是非常直接和有效的): 演示:Python 根据给定的位数计算可能的最大值,python,bits,Python,Bits,我有一个需要传递任意位数的函数,例如7。是否有一种straitforward方法来计算该位数的最大可用位数。例如,如果我传入8,函数将返回255 有没有一种简单/有效的方法可以做到这一点 你可以这样做(我认为这是非常直接和有效的): 演示: 这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。您可以这样做(我认为这非常简单、有效): 演示: 这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。将数字1左移位数,减去1: def max_bits(b):
这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。您可以这样做(我认为这非常简单、有效): 演示:
这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。将数字1左移位数,减去1:
def max_bits(b):
return (1 << b) - 1
位移位比使用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
导入timeit
>>>def最大位移位(b):
... 返回(1>>def最大位exp(b):
…返回(2**b)-1
...
>>>timeit.timeit('f(256)','from'uuuuuuu main'uuuuuuuu导入最大位\u exp为f')
2.767354965209961
>>>timeit.timeit('f(256)','from'uuuuuuu main'uuuuuuu导入最大位\u位移位为f')
0.49823594093322754
对于256位的数字来说,速度快了5倍多!将数字1左移位数,减去1:
def max_bits(b):
return (1 << b) - 1
位移位比使用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
导入timeit
>>>def最大位移位(b):
…返回(1>>def最大位exp(b):
…返回(2**b)-1
...
>>>timeit.timeit('f(256)','from'uuuuuuu main'uuuuuuuu导入最大位\u exp为f')
2.767354965209961
>>>timeit.timeit('f(256)','from'uuuuuuu main'uuuuuuu导入最大位\u位移位为f')
0.49823594093322754
对于256位的数字来说,这比5倍还要快!
(2**n)-1
快速给出最大值(2**n)-1
要快速给出最大值,需要将最大值减去1,需要将最大值减去1。过早优化。@埃里卡利克:为什么会出现这种过早优化?我只是碰巧用一种更有效的方法知道这一点;这并不是说另一个选项更易读或更容易维护。@埃里卡利克:p还有其他方法吗当人们确实需要优化他们的代码时,他们会发现应该使用什么方法?当你在某个关键循环中创建位掩码时,5倍的速度差会产生巨大的差异。这是一个堆栈溢出的答案,很可能它会一直存在,并被未来几年的许多人用作参考,以及类似的信息对于正在进行优化的人来说,这一点很重要。第一个选项对于很多(如果不是大多数)代码读者来说肯定更具可读性;在任何情况下,我只是为那些可能认为他们必须使用更快方法的人添加了注释。过早优化。@ErikAllik:为什么会出现这种过早优化?我只是碰巧知道这一点更有效方法;这并不是说另一个选项更可读或更易于维护。@ErikAllik:当人们确实需要优化代码时,如何才能发现使用哪种方法呢?当您在某个关键循环中创建位掩码时,5倍的速度差可能会产生巨大的差异。这是堆栈溢出的答案,可能是e它将保持不变,并被未来几年的许多人用作参考,类似的信息对于正在优化的人来说非常重要。第一个选项对于许多(如果不是大多数)代码读者来说肯定更具可读性;无论如何,我只是为那些可能认为他们必须使用更快方法的人添加了注释。
>>> 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