14


5

X数よりも小さい2の最大のべき乗を見つけますか?

私はこれをやっています

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数よりも小さい2の最大のべき乗を見つけるためのPythonの方法は何ですか?

編集例:power_two(100)は、電力のみを返します

5 回答


26


対数を見つけて切り捨てます。

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


18


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

n!= 0`の定義により: 2 (n.bit_length()-1)⇐ abs(n)<2 n.bit_length() `


6


2つの方法、最初は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)


0


.formatのパワーを活用!

def maxPowOf2(n):
     return len("{0:b}".format(n))-1

この答えは@jfsよりも似ていますが、おそらく遅いです…​ +は、数値をバイナリ文字列に変換し、長さを見つけます。 +しかし、負の数では正しく動作しません…​


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