Комментарии 20
На БЭСМ-6 были команды "Сборка по маске " и "Разборка по маске".
А в современных процессорах есть что-нибудь похожее?
Есть подозрения, что битовые операции в Си (и ++) в Visual Studio немного разачаровывают в плане производительности относительно аналога с простыми выражениями.
...
Если конкретно, то реализовывал разные способы UV тайлинга в софтварном растеризаторе и наткнулся на описанное выше. По сути в нём всё в цикле и за секунду молотит не менее 43 200 000 операций (Конечно это лишь пару процентов от пайплайна и нагрузки!), но тесты показывали устойчивую тенденцию.
P.S. Возможно это цпецифика блока кода после компиляции опр. ветви AST дерева и как следствие простые инструкции в АСМ обрастают обвязочными доп. командами.
(Сын пишет свой ЯП и подобное обсуждали)
Автору статьи - Вроде и этап пройден давно, но всегда с удовольствием читаю такие посты.
А нынче они редки. Спасибо!
Пару раз приходилось выяснять — число чётное или нет, и для этого достаточно проверить самый правый бит:
int число = 5;
if(число & 1) нечётный = true;
ИМХО, идеоматичней писать if (a % 2).
Это работает на всех процессорах? Если не работает с float, то остаток всё-равно отмечается?
Еще бы хотел добавить, про одно довольно очевидное применение, как представление множеств битовыми последовательностями. Если считать наличие/отсутствие i-го бита, наличием отсутствием элемента, то через битовые операции можно выразить практически все необходимые базовые операции (intersect, union, complement, etc)
Обожаю думать в битах, когда надо. Следствие того, что первый язык у меня был ассемблер. Это отражается на моих структурах - как в нормальных языках, которые использую сегодня (с, с++, с#), так и при моделировании и работе с любыми базами данных.
Только сегодня при таких дешёвых носителях памяти редко кто опускается до этого. По крайней мере в кругу моих знакомых никого не знаю. Там не то, чтобы в битах не думают. Там нормализация данных - редкий случай.
Ни плюсовать ни минусовать не могу. Поэтому только так - срасибо за статью!
Уменьшение объёма данных увеличивает скорость работы программы и на системах с большим объёмом памяти, за счёт возможности хранения всего набора данных в регистрах или быстром кэше. А на микроконтроллерах я постоянно применяю представления множеств на базе bitset, и нередко — упакованные массивы 2..4-битовых полей. На C++ это красиво абстрагируется, и при этом быстро работает.
Только при делении-сдвиге вправо отрицательных чисел надо быть аккуратнее. Попробуйте сдвинуть вправо -1. Для остальных чисел к слову все правильно получается
Единственно не понятно, зачем "Без математики." в заглавии?
Читая (ладно по диагонали проглядывая) эту статью, я всё никак не мог откинуть мысль, что это так-то базовые вещи, я жил в заблуждении что каждый программист их знает.
Открывая эту статью, ожидал увидеть нечто похожее на начало книги "Hacker's delight" (на русском как "алгоритмические трюки для программистов"). Там в первой главе рассматриваются битовые операции а-ля "как узнать что число является степенью двойки", посчитать кол-во взведенных единиц в слове, обнулить самый младший бит в слове. Интересующимся битовыми операциями - очень рекомендую.
Благодарствую. Весьма сжато и познавательно для меня.
Откройте для себя весь потенциал побитовых операторов. Без математики