2010-09-26 7 views
13

Me estoy haciendo esto¿Encuentra la potencia más grande de dos menos que el número 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 

cuál es el camino para encontrar Pythonic mayor potencia de dos menos que el número de X?

EDITAR ejemplo: power_two (100) devolver sólo el poder

+1

Cuando dice menos que, ¿quiere decir "menor o igual" o "estrictamente menor que"? En otras palabras, ¿qué debería devolver si n es una potencia exacta de 2, por ejemplo 32? –

+3

¿Qué es "pitónico" sobre el uso de logaritmos? Esos son los antecedentes de Python por 377 años más o menos. –

+0

@JUST MI OPINIÓN correcta: ¿Qué sugieres en su lugar? –

Respuesta

26

Encuentra el logaritmo y truncará:

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

gracias, pero quiero este retorno 6 "2 ** 6" en lugar de 64 – user422100

+0

@mark: me refiero a solo devolver 6, el "2 ** 6" fue para explicar de dónde vienen los 6, pero me da una pitonica manera, gracias – user422100

+0

@ user422100: OK, ahora entiendo. –

6

de dos maneras, en primer lugar sólo funciona en Python 2.7 y tal vez 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

La parte -3 se arruinaría si el binario fuera negativo. –

15

Usted podría utilizar bit_length():

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

Por definición para n != 0: 2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

+1

Esta es una buena solución, aunque en realidad Tony Veijalainen ya la publicó, es solo que su respuesta es menos clara. Le di mi +1 por ser el primero en sugerirlo y también por mencionar que requiere Python 2.7 o posterior, lo cual es una preocupación muy real: muchos usuarios todavía están en Python 2.6. –

+0

@Mark Byers: también voté Tony Veijalainen (fue -1). Python 2.7 es la versión actual de CPython, por lo tanto, no lo menciono explícitamente (utilizo 2.4 en el trabajo, así que entiendo de dónde vienes). Cuando vi su respuesta, pensé que debía haber alguna solución poco entreverada (MSB). 'long.bits_in_digit()' no es público, por lo que 'bit_length()' es la mejor opción. – jfs

-2

Um así que estoy seguro que las otras sugerencias de trabajo, pero siento que llevará a cabo terriblemente lento. En realidad, no he verificado ninguna velocidad, ¡pero esto debería ser extremadamente rápido!

Esto también está en Java. Entonces necesitarías convertirlo.

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; 
} 
Cuestiones relacionadas