Алгоритмы и структуры данных
8.51K subscribers
283 photos
8 links
По всем вопросам: @altmainf

Уважаемый менеджер: @altaiface
Download Telegram
Нахождение логарифма по основанию 2 от N-битного числа за O(lg(N)) операций. Метод с использованием битовых масок и сдвигов

Пример работы:

Для числа 29 (в двоичной форме 11101):
- На первой итерации, v не имеет значимого бита в диапазоне, определяемом 0xFFFF0000, поэтому ничего не происходит.
- На второй итерации, v не имеет значимого бита в диапазоне, определяемом 0xFF00, поэтому ничего не происходит.
- На третьей итерации, v имеет значимый бит в диапазоне, определяемом 0xF0, поэтому v сдвигается вправо на 4 бита и к результату r добавляется 4.
- На четвертой итерации, v имеет значимый бит в диапазоне, определяемом 0xC, поэтому v сдвигается вправо на 2 бита и к результату r добавляется 2.
- На пятой итерации, v не имеет значимого бита в диапазоне, определяемом 0x2, поэтому ничего не происходит.

Таким образом, для числа 29 (двоичный 11101) результат будет 4.
Нахождение логарифма по основанию 2 от N-битного числа за O(lg(N)) операций. Метод для чисел, которые являются степенями двойки

Пример работы:

Для числа 16 (в двоичной форме 10000):
- Первая маска 0xAAAAAAAA проверяет биты на четных позициях, в данном случае это бит 4, который не установлен.
- Вторая маска 0xCCCCCCCC проверяет блоки по два бита, в данном случае это биты 6-7, которые не установлены.
- Третья маска 0xF0F0F0F0 проверяет блоки по четыре бита, в данном случае это бит 8, который не установлен.
- Четвертая маска 0xFF00FF00 проверяет блоки по восемь бит, в данном случае это биты 16-23, которые не установлены.
- Пятая маска 0xFFFF0000 проверяет старшие шестнадцать бит, в данном случае это бит 16, который установлен.

Таким образом, для числа 16 (двоичный 10000) результат будет 4, так как 16 является 2^4.
Нахождение логарифма по основанию 2 от N-битного числа за O(lg(N)) операций. Метод для процессоров с медленными ветвлениями

Пример работы:
Для числа 19 (в двоичной форме 10011):
- В первой проверке, (v > 0xFFFF) вернет false, так как 19 меньше 0xFFFF (65535), r останется 0.
- Во второй проверке, (v > 0xFF) также вернет false, так как 19 меньше 0xFF (255), r останется 0.
- В третьей проверке, (v > 0xF) вернет true, так как 19 больше 0xF (15), r станет 4 и v сдвинется на 4 вправо, что даст 1 (двоичный 1).
- Далее, (v > 0x3) вернет false, shift останется 0.
- Последняя операция r |= (v >> 1) прибавит 0 к r.

Таким образом, для числа 19 результат будет 4, так как наибольший бит установлен на позиции 4.
Вычисление логарифма по основанию 2, используя последовательность Де Брёйна и умножение

Объяснение кода
1. Приведение числа к форме, удобной для вычислений:
- Сначала число приводится к виду, при котором все биты справа от старшего установленного бита также устанавливаются в 1. Это делается с помощью серии операций сдвига и побитового ИЛИ (|).
- После выполнения этих операций, если входное число было, например, 10011000, оно станет 11111111.

2. Вычисление позиции старшего установленного бита с использованием умножения и таблицы поиска:
- Используется последовательность Де Брёйна, умножение и побитовый сдвиг для нахождения позиции MSB.
- Умножение числа на специальную константу и сдвиг результата позволяет эффективно найти индекс в таблице поиска MultiplyDeBruijnBitPosition, где и содержится искомая позиция MSB.
Вычисление логарифма по основанию 10 целого числа

Для нахождения целочисленного логарифма по основанию 10 от 32-битного числа можно воспользоваться следующей стратегией. Сначала нужно найти логарифм по основанию 2 от числа, а затем использовать это значение для вычисления логарифма по основанию 10, используя свойства логарифмов.

Этот метод обеспечивает быстрое и точное вычисление логарифма по основанию 10 от целого числа.
Определение целого логарифма по основанию 10. Простой способ

Чтобы разобраться, как работает этот метод нахождения логарифма по основанию 10, рассмотрим пример:

пусть v = 12345.

- Сначала проверяем v >= 1000000000 — это ложь.
- Затем проверяем v >= 100000000 — это тоже ложь.
- Проверяем v >= 10000000 — опять ложь.
- Проверяем v >= 1000000 — тоже ложь.
- Проверяем v >= 100000 — снова ложь.
- Проверяем v >= 10000 — это истина.

Поскольку 12345 больше или равно 10000, но меньше чем 100000, мы присваиваем r = 4.
Подсчет количества последовательных нулевых битов (замыкающих) справа линейным методом

Подсчет замыкающих нулевых битов в бинарном представлении числа — это задача, с которой часто сталкиваются в программировании, например, при реализации алгоритмов низкоуровневой оптимизации или работы с битовыми масками. Линейный метод для подсчета замыкающих нулевых битов является простым и эффективным для использования в различных приложениях.
Подсчет количества последовательных нулевых битов (замыкающих) справа параллельным методом

Подсчет замыкающих нулевых битов в бинарном представлении числа является важной задачей в различных приложениях, таких как криптография, обработка сигналов и другие области вычислительной техники. Параллельный метод позволяет быстро вычислить количество замыкающих нулевых битов, используя битовые операции.
Подсчет количества последовательных нулевых битов (замыкающих) справа методом бинарного поиска

Метод бинарного поиска позволяет эффективно подсчитать количество замыкающих нулевых битов в 32-битном числе. Этот метод использует последовательное деление числа на части и проверку их на наличие нулей, что делает его быстрым и эффективным.

Преимущества метода
- Эффективность: Метод бинарного поиска эффективен благодаря уменьшению числа битов, подлежащих проверке, на каждой итерации. В худшем случае требуется выполнить лишь несколько шагов, чтобы определить количество замыкающих нулевых битов.
- Производительность: За счет уменьшения числа выполняемых операций данный метод работает примерно на 33% быстрее по сравнению с линейными методами подсчета.
Подсчет количества последовательных нулевых битов (замыкающих) справа с использованием преобразования в float

Этот метод позволяет эффективно подсчитать количество замыкающих нулевых битов в 32-битном числе, используя особенности представления чисел в формате IEEE 754 float. Метод основан на преобразовании числа в float и извлечении экспоненты, что позволяет определить позицию младшего значащего бита.

Преимущества метода
- Эффективность: Метод требует всего около 6 операций для вычисления, что делает его весьма быстрым.
- Простота реализации: Код легко понимаем и не требует сложных конструкций.
Подсчет количества замыкающих нулевых битов справа с использованием деления по модулю и таблицы поиска

Этот метод позволяет быстро найти количество замыкающих нулевых битов в 32-битном числе, используя деление по модулю и таблицу поиска. Метод основан на уникальном соответствии значений остатка от деления на 37 позициям битов.

Преимущества метода
- Эффективность: Метод требует всего 4 операции, что делает его быстрым.
- Компактность: Использование небольшой таблицы позволяет значительно ускорить вычисления по сравнению с линейным методом.

Недостатки метода
- Ограниченность: Метод предназначен для 32-битных чисел и требует адаптации для чисел другой разрядности.
Подсчет количества замыкающих нулевых битов справа с использованием умножения и таблицы поиска

Этот метод позволяет эффективно подсчитать количество замыкающих нулевых битов (trailing zeros) в 32-битном числе, используя умножение и таблицу поиска (lookup table). Метод основан на использовании последовательности де Брёйна, которая помогает найти позицию младшего значащего бита.

Преимущества метода
- Эффективность: Этот метод требует всего несколько операций, что делает его очень быстрым.
- Компактность: Таблица поиска имеет небольшой размер (32 элемента), что позволяет использовать метод в системах с ограниченной памятью.

Недостатки метода
- Специализация на 32-битных числах: Метод адаптирован для 32-битных чисел и требует изменения для работы с числами другой разрядности.
Округление до следующей степени двойки с помощью приведения к float

Для округления 32-битного целого числа до следующей степени двойки можно использовать преобразование числа в формат float. Этот метод эффективен и требует минимального количества операций.
Перемешивание битов в Мортон-числа

Перемешивание битов (также известное как Мортон-числа) — это метод, который используется для линейного представления двумерных целочисленных координат. В этом процессе два числа, x и y, объединяются в одно число, в котором биты из x занимают четные позиции, а биты из y — нечетные. Такое представление позволяет легко сравнивать координаты и имеет свойство, что числа, находящиеся рядом друг с другом, имеют близкие значения x и y.
Перемешивание битов с использованием 64-битного умножения

Перемешивание битов (или Мортон-числа) — это процесс, позволяющий представлять двумерные координаты в одном числе, что упрощает их сравнение и сортировку. В этом методе используются 64-битные операции умножения, что позволяет выполнить перемешивание битов за 11 операций. Входные параметры x и y должны быть меньше 256.
Перемешивание битов с использованием "Магических чисел"

Перемешивание битов (или Мортон-числа) — это техника, которая позволяет линейно представлять двумерные координаты в одном числе. Используя магические числа и побитовые операции, можно эффективно перемешивать биты двух 16-битных чисел в одно 32-битное число.
Оптимизированный метод определения наличия нулевого байта в 32-битном слове

Определение наличия нулевого байта в 32-битном слове — важная задача, которая часто встречается при обработке строк и других данных.

Преимущества метода
- Эффективность: Метод использует всего 4 операции, что делает его чрезвычайно быстрым.
- Компактность: Код прост и легко интегрируется в любые программы.
- Надежность: Метод точно определяет наличие нулевого байта, минимизируя количество ложных срабатываний.
Определение наличия нулевого байта в 32-битном слове

Определение наличия нулевого байта является важной задачей при работе с данными и строками. Эффективные методы для выполнения этой проверки могут значительно улучшить производительность программ. Один из таких методов использует побитовые операции для минимизации числа операций и повышения скорости.
Определение наличия байта с определенным значением в 32-битном слове

Иногда возникает необходимость проверить, содержит ли любое 8-битное значение в 32-битном слове определенное значение. Для этого можно использовать операцию XOR, чтобы проверить совпадение каждого байта с искомым значением, и затем определить, содержит ли результат нулевой байт.
Определение наличия байта, меньше заданного значения, в 32-битном слове

Этот метод проверяет, содержит ли 32-битное слово байт с значением, которое меньше заданного числа n, используя всего 4 операции. Он эффективен и быстро выполняет задачу путем вычитания маскированного значения, инвертирования исходного слова и маскирования старших битов.
Подсчет количества байтов, меньше заданного значения

Макрос countless предназначен для подсчета количества байтов в 32-битном слове, значение которых меньше заданного числа n. Этот макрос выполняет задачу с использованием 7 арифметических и логических операций. Он позволяет эффективно обрабатывать данные, минимизируя количество операций и, следовательно, увеличивая производительность.