Как стать автором
Обновить

Откройте для себя весь потенциал побитовых операторов. Без математики

Уровень сложностиСредний
Время на прочтение13 мин
Количество просмотров22K
Всего голосов 35: ↑28 и ↓7+35
Комментарии20

Комментарии 20

На БЭСМ-6 были команды "Сборка по маске " и "Разборка по маске".

А в современных процессорах есть что-нибудь похожее?

В ARM-Cortex M есть операция извлечение битового поля.

В x86 в расширении BMI2 есть PDEP и PEXT.

Есть подозрения, что битовые операции в Си (и ++) в Visual Studio немного разачаровывают в плане производительности относительно аналога с простыми выражениями.
...
Если конкретно, то реализовывал разные способы UV тайлинга в софтварном растеризаторе и наткнулся на описанное выше. По сути в нём всё в цикле и за секунду молотит не менее 43 200 000 операций (Конечно это лишь пару процентов от пайплайна и нагрузки!), но тесты показывали устойчивую тенденцию.

P.S. Возможно это цпецифика блока кода после компиляции опр. ветви AST дерева и как следствие простые инструкции в АСМ обрастают обвязочными доп. командами.
(Сын пишет свой ЯП и подобное обсуждали)

Автору статьи - Вроде и этап пройден давно, но всегда с удовольствием читаю такие посты.
А нынче они редки. Спасибо!

Пару раз приходилось выяснять — число чётное или нет, и для этого достаточно проверить самый правый бит:
int число = 5;
if(число & 1) нечётный = true;

ИМХО, идеоматичней писать if (a % 2).

Это работает на всех процессорах? Если не работает с float, то остаток всё-равно отмечается?

Хотя, логично, что работает на всех, которые поддерживают Си.

Ну в данном случае имелась в виду работа с целыми числами. Да, конечно, это будет работать везде. Кроме того gcc, по крайней мере для x86_64, выдает идентичный код что для (a % 2), что для (a & 1).

Еще бы хотел добавить, про одно довольно очевидное применение, как представление множеств битовыми последовательностями. Если считать наличие/отсутствие i-го бита, наличием отсутствием элемента, то через битовые операции можно выразить практически все необходимые базовые операции (intersect, union, complement, etc)

Обожаю думать в битах, когда надо. Следствие того, что первый язык у меня был ассемблер. Это отражается на моих структурах - как в нормальных языках, которые использую сегодня (с, с++, с#), так и при моделировании и работе с любыми базами данных.

Только сегодня при таких дешёвых носителях памяти редко кто опускается до этого. По крайней мере в кругу моих знакомых никого не знаю. Там не то, чтобы в битах не думают. Там нормализация данных - редкий случай.

Ни плюсовать ни минусовать не могу. Поэтому только так - срасибо за статью!

Уменьшение объёма данных увеличивает скорость работы программы и на системах с большим объёмом памяти, за счёт возможности хранения всего набора данных в регистрах или быстром кэше. А на микроконтроллерах я постоянно применяю представления множеств на базе bitset, и нередко — упакованные массивы 2..4-битовых полей. На C++ это красиво абстрагируется, и при этом быстро работает.

Только при делении-сдвиге вправо отрицательных чисел надо быть аккуратнее. Попробуйте сдвинуть вправо -1. Для остальных чисел к слову все правильно получается

Это не баг, а фича.

Это действительно фича, причём на уровне процессора. В x86 различаются сдвиги вправо: есть логический (беззнаковый) shr и арифметический (знаковый) sar. В сдвиге влево знакового дополнения нет, потому shl и sal — одно и то же.

Единственно не понятно, зачем "Без математики." в заглавии?

Есть некоторое ощущение генерации текста и заголовка средствами ИИ

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

Открывая эту статью, ожидал увидеть нечто похожее на начало книги "Hacker's delight" (на русском как "алгоритмические трюки для программистов"). Там в первой главе рассматриваются битовые операции а-ля "как узнать что число является степенью двойки", посчитать кол-во взведенных единиц в слове, обнулить самый младший бит в слове. Интересующимся битовыми операциями - очень рекомендую.

Благодарствую. Весьма сжато и познавательно для меня.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий