2010-09-26 75 views
13

我在做这个找到两个小于X数的最大功率?

def power_two(n, base = -1): 
    result = 2 ** base 
    if result < n: 
     base += 1 
     power_two(n, base) 
    else: 
     if result == n: 
      print base 
     else: 
      print base - 1 

什么是找到的两个最大功率小于X号的Python的方式?

编辑 例如:power_two(100)只返回功率

+1

当你说小于,你的意思是“小于或等于”或“严格小于”?换句话说,如果n是2的精确幂,例如32,它应该返回什么? – 2010-09-26 11:45:20

+3

什么是关于使用对数的“pythonic”?那些是377年左右的Python的前奏。 – 2010-09-26 11:47:17

+0

@JJ我正确的意见:你会建议什么? – 2010-09-26 11:49:47

回答

26

找到对数和截断它:

def power_two(n): 
    return int(math.log(n, 2)) 
+0

谢谢,但我想要这个返回6“2 ** 6”,而不是64 – user422100 2010-09-26 11:36:10

+0

@mark:我的意思是只返回6,“2 ** 6”是解释从哪里来的6,但你给我一个pythonic方式,谢谢 – user422100 2010-09-26 11:46:09

+0

@ user422100:好的,我现在明白了。 – 2010-09-26 11:47:42

6

两种方式,一是只能在Python 2.7,也许3+:

import random 
for number in (random.randint(0,1<<32) for _ in range(16)): 
    print "%20i,%4i, %4i" % (number, number.bit_length()-1, len(bin(number))-3) 
+1

如果二进制文件为负值,则-3部分会被搞乱。 – 2012-05-03 09:12:45

15

你可以使用bit_length()

def power_two(n): 
    return n.bit_length() - 1 

通过定义n != 02**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

+1

这是一个不错的解决方案,虽然Tony Veijalainen实际上已经发布了它 - 这只是他的回答不太清楚。我给了我第一个建议它的+1,也提到它需要Python 2.7或更新版本,这是一个非常真实的问题 - 许多用户仍然使用Python 2.6。 – 2010-09-26 13:10:01

+0

@Mark Byers:我也投了Tony Veijalainen(这是-1)。 Python 2.7是CPython的最新版本,因此我没有明确提到它(我在工作中使用2.4,所以我明白你来自哪里)。当我看到你的答案时,我认为必须有一些琐碎的解决方案(MSB)。 'long.bits_in_digit()'不公开,所以'bit_length()'是第二好的东西。 – jfs 2010-09-26 13:33:49

-2

嗯很好,我确定其他建议的工作,但我觉得他们会进行非常缓慢。我没有实际验证任何速度,但这应该是非常快的!

这也是在Java中。所以你需要转换它。

public static int getPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return (1 << n - 1 == size) ? size : 1 << n; 
} 

public static int getNextPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return 1 << n; 
} 

public static int getPreviousPowerOfTwo(int size) 
{ 
    int n = -1; 
    while (size >> ++n > 0); 
    return 1 << n - 1; 
}