ПрограммированиеФорумОбщее

Применение битовых масок

Страницы: 1 2 3 Следующая »
#0
19:02, 28 июля 2025

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

Мне это показалось очень удобным, в связи с этим вопрос:
а где еще можно применять битовые маски?

#1
19:19, 28 июля 2025

MikeNew
Это ты изобрел Collision Groups, в принципе маски можно применять везде, где есть какие-то группы сущностей.
Еще они активно используются в разных алгоритмах рассчета контрольной суммы.
Еще их можно использовать при работе с ограниченным количеством бит (например некоторое значение у нас может быть от 0, до 1023, тогда берем значение по маске 0x3FF).
Еще можно с помощью масок и сдвигов инвертировать биты в байте.
Короче море применений им.

#2
19:49, 28 июля 2025

я ваши несы содержательно отвечал

#3
2:32, 29 июля 2025

Ну, мы применяем в HOPA проектах. Раньше клик по объекту проверялся тупым доступом к пикселю текстуры и проверкой его альфы, а теперь при загрузке строим битовые маски, и потом уже проверяем клики по ним. Удобно :)

#4
5:23, 29 июля 2025

EvgenyDrum
> применяем в HOPA проектах. Раньше клик по объекту проверялся тупым доступом к пикселю текстуры и проверкой его альфы, а теперь при загрузке строим битовые маски, и потом уже проверяем клики по ним. Удобно :)
Ну подобное я делал еще когда 2D скролл-шутер ваял, для наиточнейшего быстрого определения столкновений спрайтов - очень шустро работало.

#5
13:41, 29 июля 2025

Я применяю битовые маски при упаковке данных ошибки в unsigned int. Хочу в своём проекте задействовать доступ к байтам и битовые маски, который будет работать при любом порядке байт. Сейчас только для little-endian. На консолях используется big-endian. Вопрос в связи с порядком байт. Как вы его определяете compile-time? Сам я посмотрел решение из stl port.

#6
1:35, 30 июля 2025

Где только их не применяли...
Графика когда-то была по одному биту на пиксель. И оптимизация требовалась, ибо компы были слабенькими.
Сетевые сообщения часто приходилось оптимизировать вплоть до битов.
Развлечения ради на масках делал клеточные автоматы в видеопамяти. Не совсем на масках, правда. Там функции преобразования всех бит разом можно было использовать, по картам карно выстроенным.
В шифровании тоже маски задействованы. DES, например, в основном на них, если реализация программная. Для аппаратной реализации просто провода в нужном порядке перекрещиваются, и никаких масок.
На масках реализуются множества.
Юниксовая select использует маски для задания множества сокетов. В винде иначе, там для этого не маски.
Наверняка еще куча применений, все так просто и не вспомнишь сразу.

#7
12:26, 30 июля 2025

Какая вообще разница какой порядок байт в памяти? Операции в регистрах производятся

пс.

Откуда-то из сырков ардуино

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))
#8
15:55, 30 июля 2025

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

  Ну и проверку по маске лучше делать для определённых групп данных, чтоб они между собой не пересекались. С одной стороны удобно, с другой надо помнить больше чем для булевых переменных.

#9
3:55, 31 июля 2025

Я использовал для задания черт юнитов (декорация/монстр/нежить/летает) - позволяет легко делать сложные проверки:
1. монстр, но не нежить
2. нежить, и летает
и т.д.
Но потом оказалось, что в UE решили, что 8 флагов хватит всем, а те, кому не хватит, должны страдать.
И поэтому я перешёл на GameplayTags.

#10
6:59, 31 июля 2025

pahaa
>
> Но потом оказалось, что в UE решили, что 8 флагов хватит всем, а те, кому не хватит, должны страдать.
Это выглядит как зажлобить u_int для флагов и сказать "вам хватит и u_char". :)

В общем, самое полезное помение nes сформулировал во втором посте - группы сущностей, чтобы подменить множество if-ов всего одним, то что ты написал тоже подходит под это определение.
Надо внедрить везде где только возможно.

#11
12:39, 31 июля 2025

MikeNew
> Надо внедрить везде где только возможно.
не переусердствуй. Лучше всего это использовать именно для групп. Для каких-то отдельных проверок лучше оставить булевы проверки.
  Хотя, при должном понимании работы своей программы, можно и флаги в группы сформировать.

#12
13:53, 31 июля 2025

Маски это дорого, на самом деле. Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.

#13
15:07, 31 июля 2025

Zab
> Процессоры так устроены, что с константами на них работать дорого, а в масках как раз константы.
Почему? Должно быть даже дешевле L1D доступа. В каких-нибудь армах может быть +1 дополнительная инструкция, но я подозреваю, что она обычно сливается в общую микрооперацию.

#14
16:22, 31 июля 2025

}:+()___ [Smile]
Загрузка в регистр стоит значительно дороже, чем арифметические операции. Так что, если есть возможность обходиться без констант - надо обходиться без констант

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.