Помогите улучшить код в задаче "Степень двойки"
Условие задачи: По данному натуральному числу N найдите наибольшую целую степень двойки, не превосходящую N. Выведите показатель степени и саму степень. Операцией возведения в степень пользоваться нельзя
n = int(input())
two_in_power = 1
count = 0
while two_in_power <= n:
two_in_power *= 2
count += 1
print(count - 1, two_in_power // 2)
Как написать код так, чтобы не пришлось отнимать и делить в конце? До этого не мог решить, но получилось решить только, потому что выявил закономерность в неверных ответах и по сути подогнал под правильный ответ, отняв и разделив в конце. Буду премного благодарен, если подправите новичка
Ответы (2 шт):
Автор решения: n1tr0xs
→ Ссылка
Можно так:
n = int(input())
N = n >> 1
# N = n//2
two_in_power = 1
count = 0
while two_in_power <= N:
two_in_power *= 2
count += 1
print(count, two_in_power)
Но я бы делал так:
from math import log
power = int(log(int(input()), 2))
num = 1
for i in range(power):
num *= 2
print(power, num)
Или так, спасибо @МихаилМуругов:
power = int(input()).bit_length()-1
num = 1
for i in range(power):
num *= 2
print(power, num)
Автор решения: Михаил Муругов
→ Ссылка
n = 2**0 + 2**1 + 2**3 + 2**7 + 2**9 # Исходное число
assert n == 651
power = n.bit_length() - 1 # Наибольшая целая степень двойки, не превосходящая n - по сути номер самой старшей единички в битовой репрезентации
assert power == 9
two_in_power = n >> power << power # Отбрасываем все младшие биты, получаем 2**9
assert two_in_power == 2**9