2010-09-26 7 views
13

Mi sto facendo questotrova la potenza massima di due in meno del numero 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 

qual è il modo divinatorio per trovare più grande potenza di due meno di un numero X?

EDIT esempio: power_two (100) restituisce solo il potere

+1

Quando dici meno di, intendi "minore o uguale" o "rigorosamente meno di"? In altre parole, cosa dovrebbe restituire se n è una potenza esatta di 2, ad esempio 32? –

+3

Cos'è "pythonic" sull'uso dei logaritmi? Questi sono gli antecedenti di Python di 377 anni circa. –

+0

@JUST MY correct OPINION: cosa suggeriresti invece? –

risposta

26

Trova il logaritmo e troncare esso:

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

grazie, ma voglio questo ritorno 6 "2 ** 6" invece 64 – user422100

+0

@mark: intendo ritorno solo 6, il "2 ** 6" è stato per spiegare da dove viene il 6, ma tu mi dai un pythonic modo, grazie – user422100

+0

@ user422100: OK, ho capito ora. –

6

due modi, in primo luogo funziona solo in Python 2.7 e forse 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 sarebbe incasinata se il binario fosse negativo. –

15

Si potrebbe utilizzare bit_length():

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

Per definizione per n != 0: 2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

+1

Questa è una bella soluzione, anche se in realtà Tony Veijalainen in realtà l'ha già pubblicato - è solo la sua risposta è meno chiara. Ho dato il mio +1 a lui per essere stato il primo a suggerirlo e anche per aver detto che richiede Python 2.7 o più recente che è una preoccupazione molto reale - molti utenti sono ancora su Python 2.6. –

+0

@ Mark Byers: ho votato anche Tony Veijalainen (era -1). Python 2.7 è la versione corrente di CPython quindi non lo menziono esplicitamente (io uso 2.4 al lavoro quindi capisco da dove vieni). Quando ho visto la tua risposta, ho pensato che dovesse esserci una soluzione bit tweeter (MSB). 'long.bits_in_digit()' non è pubblico quindi 'bit_length()' è la cosa migliore successiva. – jfs

-2

Um ben Sono sicuro che gli altri suggerimenti di lavoro, ma mi sento si esibiranno terribilmente lento. Non ho effettivamente verificato alcuna velocità, ma dovrebbe essere estremamente veloce!

Questo è anche in Java. Quindi avresti bisogno di 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; 
} 
Problemi correlati