2010-09-26 11 views
13

Bu, X sayısından daha azın en büyük gücünü buluyor?

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 sayısından az iki büyük gücü bulmak için pythonic yolu nedir yapıyorum?

DÜZENLEME örnek: power_two (100) dönmek tek güç

+1

Daha az derken, "daha az mı eşit mi" veya "kesinlikle daha az" mı demek istiyorsunuz? Başka bir deyişle, n 2, 2, örneğin 32, tam bir güç ise ne dönmelidir? –

+3

Logaritma kullanımı hakkında "pythonic" nedir? Bunlar Python'un öncülleri 377 yıl kadardı. –

+0

@JUST BENİM BENİM OPİNYON: Bunun yerine ne önerirsiniz? –

cevap

26

logaritma bulun ve keser:

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

teşekkür ederim, ama bu dönüşü 6 "2 ** 6" yerine 64 – user422100

+0

@mark istiyorum: Sadece 6'yı geri döndürmek istiyorum, "2 ** 6" 6'nın nereden geldiğini açıklamaktı, ama sen bana bir pythonik verdin yol, teşekkürler – user422100

+0

@ user422100: Tamam, şimdi anlıyorum. –

6

iki yol ilk 3+ belki Python 2.7 yalnızca çalışır ve:

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

İkili negatif olursa, -3 bölüm bozulacaktı. –

15

Sen bit_length() kullanabilirsiniz:

için Tanım olarak

: 2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

+1

Bu aslında Tony Veijalainen aslında daha önce yayınlanmış olmasına rağmen, bu hoş bir çözüm - sadece onun cevabı daha az açık. Bunu önermek için +1 verdim ve Python 2.7 veya daha yeni bir endişe gerektiren daha yeni bir konu olduğunu belirtmek için de verdim - birçok kullanıcı hala Python 2.6 üzerinde. –

+0

@Mark Byers: Ben de Tony Veijalainen'e oy verdim (-1). Python 2.7 şu anki CPython sürümüdür, bu yüzden açık bir şekilde bahsetmiyorum (işte 2.4 kullanıyorum, o yüzden nereden geldiğini anlıyorum). Cevabını gördüğümde, biraz çirkin çözüm (MSB) olması gerektiğini düşündüm. long.bits_in_digit() 'kamuya açık değildir, bu yüzden bit_length()' sonraki en iyi şeydir. – jfs

-2

Um de ben başka öneriler çalıştığından emin değilim, ama onlar müthiş yavaş gerçekleştirecek hissediyorum. Hızları doğrulamamıştım ama bu çok hızlı olmalı!

Bu, Java'da da geçerlidir. Yani onu dönüştürmelisin.

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; 
} 
İlgili konular