Дано неотрицательное число n. Нужно определить, между какими степенями двойки
оно лежит: вернуть показатель k старшей степени двойки, не превосходящей n
(то есть 2^k ≤ n < 2^(k+1)), и признак, что n — ровно степень двойки.
// Log2 возвращает k = ⌊log₂ n⌋ и exact == (n == 2^k).
// Для n == 0 возвращает (-1, false).
func Log2(n uint64) (k int, exact bool)
Примеры
Log2(1) → 0, true
Log2(8) → 3, true
Log2(10) → 3, false (8 ≤ 10 < 16)
Log2(1023) → 9, false
Log2(0) → -1, false
Ограничения
0 ≤ n ≤ 2⁶⁴ − 1.
- Без
math.Log2 и плавающей точки: у float64 53 бита мантиссы, на больших
n округление даёт неверный ответ.
Устно: как проверить «n — степень двойки» за O(1) одной битовой операцией?
Разбор и эталонное решение — после своей попытки: на собеседовании подсказок не будет.
Сначала попробуй сам — подсказки не дают готовый ответ.