Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 根据给定的位数计算可能的最大值_Python_Bits - Fatal编程技术网

Python 根据给定的位数计算可能的最大值

Python 根据给定的位数计算可能的最大值,python,bits,Python,Bits,我有一个需要传递任意位数的函数,例如7。是否有一种straitforward方法来计算该位数的最大可用位数。例如,如果我传入8,函数将返回255 有没有一种简单/有效的方法可以做到这一点 你可以这样做(我认为这是非常直接和有效的): 演示: 这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。您可以这样做(我认为这非常简单、有效): 演示: 这是因为二进制位置值总是2的指数,所以这可能是最简单、最容易理解的方法。将数字1左移位数,减去1: def max_bits(b):

我有一个需要传递任意位数的函数,例如7。是否有一种straitforward方法来计算该位数的最大可用位数。例如,如果我传入8,函数将返回255

有没有一种简单/有效的方法可以做到这一点

你可以这样做(我认为这是非常直接和有效的):

演示:


这是因为二进制位置值总是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