TGViewer
Android under the hood Android under the hood @android_under_the_hood · 1.53K subscribers
Post #29 837
Как вычислить ближайшую степень двойки числа?

В очередной раз, читая исходники HashMap'ы я обнаружил прикольный алгоритм для вычисления ближайшей степени двойки некоторого числа:

// вынес в отдельную функцию
fun pow2(number: Int): Int {
    val newNumber = -1 ushr (number - 1)
        .countLeadingZeroBits()
    if (newNumber < 0) return 1
    return newNumber + 1
}
Алгоритм работает только в большую сторону, то есть для числа 5 ближайшей степенью двойки будет число 8, а не 4.

Разберёмся как работает код, чтобы не усложнять всем жизнь я буду оперировать 1-байтовым числом, для Int и Long логика абсолютна такая же:

11111111 // число -1
00000101 // число 5
00001000 // число 8

// вычитаем единицу из текущего числа, это нужно для случаев, когда число уже является степенью двойки
00000101 - 1 = 00000100

// countLeadingZeroBits() под капотом вызывает статический метод Integer.numberOfLeadingZeros(), который возвращает количество нулей перед старшим битом числа
00000100 // 5 нулей до старшего бита

// ushr безнаковый сдвиг битов вправо, безнаковый означает что при сдвиге старшая часть будет заполняться нулями, а не повторять младшие биты
11111111 ushr 5 = 00000111

// прибавляем единичку
00000111 + 1 = 00001000

// получили результат 8
00001000


Как вам такая битовая магия?) Лично мне по душе такие штуки: со стороны они кажутся сложными и запутанными, но после парочки примеров возникает своеобразный wow-эффект.

P.S. Если есть желание копать дальше, чекайте Integer класс, там полно статических методов с битовой арифметикой.

Пишите в комментах ваше мнение и всем хорошего кода!
  • 👍 12
More from @android_under_the_hood
  1. Oct 4, 2026Всем привет, хочу поделиться проектом, который запустил 1 октября — ЗдесьЯ. Это цифровая с…
  2. Oct 2, 2026Kotlin lambdas, часть I. До версии Kotlin 2.0 лямбды компилировались в анонимные классы, р…
  3. Sep 27, 2026Делегат свойства в Kotlin. В Kotlin есть конструкция, которой нет в JVM: var name by NameD…
  4. Sep 23, 2026val vs var под капотом. На уровне Kotlin все просто: val x = 10 var y = 20 y = 30 // компи…
  5. Sep 20, 2026Возвращение Прошло уже полгода с последней записи на канале. За это время в моей жизни про…
  6. Feb 5, 2026Пару фактов о Go, часть II. 4) Вместо Kotlin Nullability указатели как в С/C++, то есть об…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →