Помогите улучшить код в задаче "Степень двойки"

Условие задачи: По данному натуральному числу 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
→ Ссылка