XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
nic666

offline
Опыт: 4,012
Активность:
Битовые логические операции
Вот тут в кеш собрался писать достаточно много данных. Возникает идея как сократить общее количество записей, за счет работы с отдельными битами...

То есть нужны битовые логические операции AND, OR, NOT, XOR, которые есть почти во всех языках программрирования.

Так может и в jass-е есть? Поиск в blizzard.j ничего не дал и в примерах я тоже не нашел.
Может кто-то подскажет, есть ли они там как операторы, или описаны как фунциии или же их нет совсем.


P.S.
3 or 5 = 7
12 and 1 = 0 и не путать с "(A=0) and (B=0)"
Старый 29.08.2006, 14:28
zibada

offline
Опыт: отключен
нет.
можно написать свои функции для работы с ними, но т.к. при этом теряется основное преимущество - быстродействие (извлечение бита будет сравнимо по трудоемкости с чтением кэша), практической пользы в этом нет никакой.
хотя конечно, находятся любители... но это уже кодинг чисто ради кодинга, и не более того.
Старый 29.08.2006, 14:30
nic666

offline
Опыт: 4,012
Активность:
Извиняюсь, запоздало нашел такую тему. До этого искал не так :)
http://xgm.guru/forum/showthread.php?t=4094&page=1&highlight=%C1%E8%F2%EE%E2%FB%E5+%EB%EE%...0%E0%F 6%E8%E8

nic666 добавил:
Но функции которые там описаны, я пожалуй не использую. Мне нужно только проверять установлен ли один бит в целой переменной, и для этого переводить в двоичную строку "слишком жирно".
Старый 29.08.2006, 14:34
zibada

offline
Опыт: отключен
в твоем случае, если хочешь минимизировать число записей, храни последовательности в строках вида "0011100011" и для проверки извлекай подстроки в 1 символ.
быстрее и нагляднее будет.
Старый 29.08.2006, 14:36
remal
нечто
offline
Опыт: 2,087
Активность:
Цитата:
Сообщение от nic666
Но функции которые там описаны, я пожалуй не использую. Мне нужно только проверять установлен ли один бит в целой переменной, и для этого переводить в двоичную строку "слишком жирно".

легко! используй переполнение:
пусть число NUM (целое число) состоит из n бит
пусть тебе нужно получить его i бит.
Код:
set NUM = NUM * I2R(pow(2, n-i))
set NUM = NUM / I2R(pow(2, n-1))
set NUM = NUM * I2R(pow(2, i-1))

если после всех операций NUM == 0, тогда бит равен нулю, в противном случае бит равен 1.

насколько я помню, в jass n = 32

Отредактировано remal, 29.08.2006 в 17:12.
Старый 29.08.2006, 17:04
DioD

offline
Опыт: 45,184
Активность:
В РС есть модуль работы с битами, тока вот где рс потерялся я не знаю.
Старый 29.08.2006, 17:23
remal
нечто
offline
Опыт: 2,087
Активность:
Цитата:
Сообщение от DioD
В РС есть модуль работы с битами, тока вот где рс потерялся я не знаю.

нахрен тут что-то городить?
Старый 29.08.2006, 18:21
DioD

offline
Опыт: 45,184
Активность:
А разве я неправильно сказал?
Старый 29.08.2006, 19:07
nic666

offline
Опыт: 4,012
Активность:
remal
я предпочел другое решение
Код:
if (p>=8) then
   set p=p-8
   //действия если бит 3 установлен
 endif
 if (p>=4) then
   set p=p-4
   //действия если бит 2 установлен
 endif
 if (p>=2) then
   set p=p-2
   //действия если бит 1 установлен
 endif
 if (p=1) then
     //действия если бит 0 установлен
 endif

И никаких умножений, делений и т.п. При желании можно добавить ряд степеней соответственно сравнивать с 16,32,64 и т.д. Но мне пока нужно только четыре бита.
Старый 30.08.2006, 12:07
remal
нечто
offline
Опыт: 2,087
Активность:
nic666, прости, но это - бред! работать будет во много раз медленнее!
Старый 30.08.2006, 23:12
Toadcop

offline
Опыт: 53,013
Активность:
Цитата:
nic666, прости, но это - бред! работать будет во много раз медленнее!
- =) это бред будет работать быстрей чем РОВ ! умножение деление ! ты гонешь лутче бы это ты не писал =)


nic666 идея интересная =)
Старый 31.08.2006, 14:33
remal
нечто
offline
Опыт: 2,087
Активность:
Toadcop, готов за слова ответить?
Старый 31.08.2006, 17:52
DioD

offline
Опыт: 45,184
Активность:
Ругаться тут не стоит, выложи тот код что потвоему мнению правильный и самый работоспособный, измерить скорость выполнения можно без каких либо доп программ при помощи наложения потоков, заодно будет тест этой самой системы.
Старый 31.08.2006, 18:10
nic666

offline
Опыт: 4,012
Активность:
Не ругайтесь, мой код быстрее для 4х битов, но если вы будете проверять один бит из 32 и со случайным номером, то может оказаться и медленее... равенство в скорости где-то на 8-10 битах если битов больше - то лучше деление/умножение...

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

nic666 добавил:
Кроме того, мой выбор обоснован тем, что мне нужно проверять несколько бит в одном месте, а не только лишь 1 бит в разных местах...
Старый 31.08.2006, 21:31
DotA_DR

offline
Опыт: 103
Активность:
Так как написал remal будет работать не всегда, так как умножение и деление знаковые
при первом же умножении число будет отрицательным, если бит установлен.
по этому проще произвольный бит проверять так
Код:
if NUM * Pow2[32 - i] < 0 then
    // бит установлен
  else
    // бит не установлен
  endif


Pow2 это массив степеней двойки, который инициализируется при загрузки карты


и ещё современные процессоры оптимизированы на умножение на степень двойки, так что затраты на такое умножение сравнимы с операцией сложение
Старый 31.08.2006, 22:34
DioD

offline
Опыт: 45,184
Активность:
Двойка рулит, тут я соглашусь.
Старый 31.08.2006, 22:40
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 03:02.