Я только недавно вспомнил что они вообще есть и реализовал их у себя для определения типов объектов для которых нужно проводить проверку на пересечение, и типов для которых не нужно (например, незачем проверять пересечение стрел или файрболов с другими стрелами или файрболами).
Мне это показалось очень удобным, в связи с этим вопрос:
а где еще можно применять битовые маски?
MikeNew
Это ты изобрел Collision Groups, в принципе маски можно применять везде, где есть какие-то группы сущностей.
Еще они активно используются в разных алгоритмах рассчета контрольной суммы.
Еще их можно использовать при работе с ограниченным количеством бит (например некоторое значение у нас может быть от 0, до 1023, тогда берем значение по маске 0x3FF).
Еще можно с помощью масок и сдвигов инвертировать биты в байте.
Короче море применений им.
я ваши несы содержательно отвечал
Ну, мы применяем в HOPA проектах. Раньше клик по объекту проверялся тупым доступом к пикселю текстуры и проверкой его альфы, а теперь при загрузке строим битовые маски, и потом уже проверяем клики по ним. Удобно :)
EvgenyDrum
> применяем в HOPA проектах. Раньше клик по объекту проверялся тупым доступом к пикселю текстуры и проверкой его альфы, а теперь при загрузке строим битовые маски, и потом уже проверяем клики по ним. Удобно :)
Ну подобное я делал еще когда 2D скролл-шутер ваял, для наиточнейшего быстрого определения столкновений спрайтов - очень шустро работало.
Я применяю битовые маски при упаковке данных ошибки в unsigned int. Хочу в своём проекте задействовать доступ к байтам и битовые маски, который будет работать при любом порядке байт. Сейчас только для little-endian. На консолях используется big-endian. Вопрос в связи с порядком байт. Как вы его определяете compile-time? Сам я посмотрел решение из stl port.
Где только их не применяли...
Графика когда-то была по одному биту на пиксель. И оптимизация требовалась, ибо компы были слабенькими.
Сетевые сообщения часто приходилось оптимизировать вплоть до битов.
Развлечения ради на масках делал клеточные автоматы в видеопамяти. Не совсем на масках, правда. Там функции преобразования всех бит разом можно было использовать, по картам карно выстроенным.
В шифровании тоже маски задействованы. DES, например, в основном на них, если реализация программная. Для аппаратной реализации просто провода в нужном порядке перекрещиваются, и никаких масок.
На масках реализуются множества.
Юниксовая select использует маски для задания множества сокетов. В винде иначе, там для этого не маски.
Наверняка еще куча применений, все так просто и не вспомнишь сразу.
Какая вообще разница какой порядок байт в памяти? Операции в регистрах производятся
пс.
Откуда-то из сырков ардуино
bitutils.h
#pragma once #define bitRead(value, bit) ( ( ( value) >> ( bit)) & 0x01) #define bitSet( value, bit) ( ( value) |= ( 1UL << ( bit))) #define bitClear( value, bit) ( ( value) &= ~( 1UL << ( bit))) #define bitToggle( value, bit) ( ( value) ^= ( 1UL << ( bit))) #define bitWrite( value, bit, bitvalue) ( ( bitvalue) ? bitSet( value, bit) : bitClear( value, bit))
Достаточно понять, что битовые маски - это простые булевы операции. Разница в том, что с помощью маски ты вместо булевой проверки делаешь масочную проверку, в большинстве случаев вручную (хотя и булевы переменные так же).
Ну и проверку по маске лучше делать для определённых групп данных, чтоб они между собой не пересекались. С одной стороны удобно, с другой надо помнить больше чем для булевых переменных.
Я использовал для задания черт юнитов (декорация/монстр/нежить/летает) - позволяет легко делать сложные проверки:
1. монстр, но не нежить
2. нежить, и летает
и т.д.
Но потом оказалось, что в UE решили, что 8 флагов хватит всем, а те, кому не хватит, должны страдать.
И поэтому я перешёл на GameplayTags.
pahaa
>
> Но потом оказалось, что в UE решили, что 8 флагов хватит всем, а те, кому не хватит, должны страдать.
Это выглядит как зажлобить u_int для флагов и сказать "вам хватит и u_char". :)
В общем, самое полезное помение nes сформулировал во втором посте - группы сущностей, чтобы подменить множество if-ов всего одним, то что ты написал тоже подходит под это определение.
Надо внедрить везде где только возможно.
MikeNew
> Надо внедрить везде где только возможно.
не переусердствуй. Лучше всего это использовать именно для групп. Для каких-то отдельных проверок лучше оставить булевы проверки.
Хотя, при должном понимании работы своей программы, можно и флаги в группы сформировать.
Маски это дорого, на самом деле. Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.
Zab
> Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.
Почему? Должно быть даже дешевле L1D доступа. В каких-нибудь армах может быть +1 дополнительная инструкция, но я подозреваю, что она обычно сливается в общую микрооперацию.
}:+()___ [Smile]
Загрузка в регистр стоит значительно дороже, чем арифметические операции. Так что, если есть возможность обходиться без констант - надо обходиться без констант
Тема в архиве.