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 | #1
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
zibada
offline
Опыт: отключен
|
нет.
можно написать свои функции для работы с ними, но т.к. при этом теряется основное преимущество - быстродействие (извлечение бита будет сравнимо по трудоемкости с чтением кэша), практической пользы в этом нет никакой. хотя конечно, находятся любители... но это уже кодинг чисто ради кодинга, и не более того. |
29.08.2006, 14:30 | #2
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
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 | #3
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
zibada
offline
Опыт: отключен
|
в твоем случае, если хочешь минимизировать число записей, храни последовательности в строках вида "0011100011" и для проверки извлекай подстроки в 1 символ. быстрее и нагляднее будет. |
29.08.2006, 14:36 | #4
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
Цитата:
легко! используй переполнение: пусть число NUM (целое число) состоит из n бит пусть тебе нужно получить его i бит. Код:
если после всех операций NUM == 0, тогда бит равен нулю, в противном случае бит равен 1. насколько я помню, в jass n = 32 Отредактировано remal, 29.08.2006 в 17:12. |
|
29.08.2006, 17:04 | #5
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
В РС есть модуль работы с битами, тока вот где рс потерялся я не знаю. |
29.08.2006, 17:23 | #6
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
Цитата:
нахрен тут что-то городить? |
|
29.08.2006, 18:21 | #7
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
А разве я неправильно сказал? |
29.08.2006, 19:07 | #8
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
4,012Активность: |
remal
я предпочел другое решение Код:
И никаких умножений, делений и т.п. При желании можно добавить ряд степеней соответственно сравнивать с 16,32,64 и т.д. Но мне пока нужно только четыре бита. |
30.08.2006, 12:07 | #9
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
nic666, прости, но это - бред! работать будет во много раз медленнее!
|
30.08.2006, 23:12 | #10
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
Toadcop
offline
Опыт:
53,013Активность: |
Цитата:
nic666 идея интересная =) |
|
31.08.2006, 14:33 | #11
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
remal
нечто
offline
Опыт:
2,087Активность: |
Toadcop, готов за слова ответить?
|
31.08.2006, 17:52 | #12
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
Ругаться тут не стоит, выложи тот код что потвоему мнению правильный и самый работоспособный, измерить скорость выполнения можно без каких либо доп программ при помощи наложения потоков, заодно будет тест этой самой системы. |
31.08.2006, 18:10 | #13
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
nic666
offline
Опыт:
4,012Активность: |
Не ругайтесь, мой код быстрее для 4х битов, но если вы будете проверять один бит из 32 и со случайным номером, то может оказаться и медленее... равенство в скорости где-то на 8-10 битах если битов больше - то лучше деление/умножение...
nic666 добавил: скорость работы сильно зависит от данных, поэтому не стоит так категорично выступать... nic666 добавил: Кроме того, мой выбор обоснован тем, что мне нужно проверять несколько бит в одном месте, а не только лишь 1 бит в разных местах... |
31.08.2006, 21:31 | #14
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DotA_DR
offline
Опыт:
103Активность: |
Так как написал remal будет работать не всегда, так как умножение и деление знаковые
при первом же умножении число будет отрицательным, если бит установлен. по этому проще произвольный бит проверять так Код:
Pow2 это массив степеней двойки, который инициализируется при загрузки карты и ещё современные процессоры оптимизированы на умножение на степень двойки, так что затраты на такое умножение сравнимы с операцией сложение |
31.08.2006, 22:34 | #15
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|
DioD
offline
Опыт:
45,184Активность: |
Двойка рулит, тут я соглашусь. |
31.08.2006, 22:40 | #16
+0/−0
Профиль |
Приват |
Поиск |
Цитата |
IP: Записан
|