xozzslip
@xozzslip
Чекни мой канал о кодинге https://bit.ly/2LNBAL8

Как определить, является ли число степенью двойки на python3?

n = 16
from math import log
print(isinstance((log(n, 2)), int)) #Вывод будет False

Проблема в том, что log(16, 2) # = 4.0 по мнению интерпретатора не является целым числом.

Как можно по другому проверить является ли n степенью двойки?
  • Вопрос задан
  • 12538 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Ох..но, проверять степень двойки с помощью логарифма.
Вот вам идея для решения попроще: n & (n - 1) равно нулю только для нуля и степеней двойки (& -- побитовое "и").
Ответ написан
xozzslip
@xozzslip Автор вопроса
Чекни мой канал о кодинге https://bit.ly/2LNBAL8
Снимаю вопрос.

n = 16
from math import log

Logn = log(n, 2)
if (Logn == int(Logn)):
	print "True"
else:
	print "False"
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
donkaban
@donkaban
Умею рисовать тени
return x && ((x & (x - 1)) == 0); Гугл отключили?
Ответ написан
@bromzh
Drugs-driven development
Тебе же в прошлом вопросе разжевали всё, зачем снова плодить глупые вопросы? Но если ты прошлый вопрос спрашивал, чтобы таким образом проверять на степень двойки, то лучше сразу уходи их профессии. Изучи хотя бы основы построения алгоритмов.

Нормальная и быстрая проверка на степень двойки делается через бинарные операции:
def check2rec(num):
    if num == 1:
        return True
    if num & 1:
        return False
    return check2rec(num >> 1)

Плюс, эту функцию можно ещё пооптимизировать.

Ну и бенчмарки, чтобы доказать ущербность логарифмического метода:
def check2rec(num):
    if num == 1:
        return True
    if num & 1:
        return False
    return check2rec(num >> 1)

def check2log(num):
    r = log(num, 2)
    return int(r) == r

numbers = list()
print('Generating numbers...')
for _ in range(1000):
    numbers.append(randint(10000, 1000000))
print('Done!')

start = datetime.datetime.now()
for _ in range(10000):
    for n in numbers:
        check2rec(n)
print('Rec: ', datetime.datetime.now() - start)

start = datetime.datetime.now()
for _ in range(10000):
    for n in numbers:
        check2log(n)
print('Log: ', datetime.datetime.now() - start)

Результаты:
Rec:  0:00:07.408942
Log:  0:00:12.101660

Разница почти в 2 раза.

P.S. С такими "знаниями" тебя в более-менее приличное место не возьмут никогда. Изучи сперва программирование (т.е. построение алгоритмов), а не язык. Почитай Вирта, Кормена, или SICP.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы