[Система] bitset
|
|
SirNikolas | Дата: Вторник, 27 Сентября 2011, 15:16:25 | Сообщение # 1 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| bitset - это класс в языке C++, позволяющий оперировать каждым отдельным битом в числе. Это настолько полезная штука, что я решил реализовать ее в JASS. Конечно, у этой версии возможностей меньше, чем у оригинала, но для WarCraft это не важно.
Я сделал две версии - для vJASS (требуется JNGP) и для простого JASS2. Думаю, не надо говорить, какая из них более удобная и обладает большим функционалом.
В данный момент система поддерживает работу только с 30 битами (из 32), однако это будет исправлено в будущем.
Самое простое использование bitset - перевод чисел из десятичной системы счисления в двоичную и обратно:Code local bitset bs = bitset.create() set bs.integer = 100 call BJDebugMsg("dec(" + I2S(bs.integer) + ") = bin(" + bs.string + ")") set bs.string = "1100100" call BJDebugMsg("dec(" + I2S(bs.integer) + ") = bin(" + bs.string + ")") call bs.destroy() Сначала нужно создать объект bitset и записать в его переменную этого типа. Затем мы можем получить доступ к десятичному представлению числа и двоичной строке, используя "<имя переменной>.integer" и "<имя переменной>.string". После использования объект необходимо уничтожить, иначе будет своеобразная утечка памяти.
Создавать bitset можно не только через .create():Code local bitset bs = bitset.create()//Создает bitset с нулевым начальным значением local bitset bs2 = bitset.initialize(10)//Создает объект и присваивает начальное значение 10 local bitset bs3 = bitset.parse("10100")//Создает объект и присваивает начальное значение, соответствующее переданной двоичной строке, т. е. 20
Также с помощью этой системы можно получать или изменять конкретные биты в числе с помощью квадратных скобок:Code local bitset bs = bitset.initialize(10)//"1010" set bs[0] = true call BJDebugMsg(bs.string)//Выведет "1011" set bs[1] = false call BJDebugMsg(bs.string)//Выведет "1001" set bs[3] = true call BJDebugMsg(bs.string)//Выведет "1001" - значение не изменилось if bs[2] == false then call BJDebugMsg("Третий бит равен 0") endif call bs.destroy() Заметьте, что биты нумеруются справа налево, с нуля.
И, наконец, можно "вырезать" и "заменять" целые группы битов:Code local bitset bs = bitset.parse("10011100")//156 call BJDebugMsg(I2S(bs.cut(1, 3)))//Вырезает со второго по четвертый биты ("110"); выводит их десятичное представление - 6 call bs.replace(0, 2, 2)//Заменяет с первого по третий биты двоичной строкой, соответствующей числу 2 ("010") call BJDebugMsg(bs.string)//Выведет "10011010" call bs.destroy()
В демонстрационной карте приведено четыре примера практического применения класса bitset.
Скачать v1.0 Скачать v1.0 JASS2
|
|
|
|
[DS] | Дата: Вторник, 27 Сентября 2011, 17:58:48 | Сообщение # 2 |
9 уровень
Группа: Проверенные
Сообщений: 1116
Награды: 0
Репутация: 527
Блокировки:
| а для чего можно это использавать?
|
|
|
|
SirNikolas | Дата: Среда, 28 Сентября 2011, 10:34:37 | Сообщение # 3 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Спектр применения самый широкий - от простого разложения числа на сумму степеней двойки до создания Save/Load-кода. Можно сильно сжать ваши целочисленные, поместив сразу несколько из них в bitset. Можно использовать его вместо массива логических. Скачай карту, там есть примеры.
|
|
|
|
[DUОS] | Дата: Среда, 28 Сентября 2011, 19:09:55 | Сообщение # 4 |
Группа: Заблокированные
Сообщений: 6279
Награды: 9
Репутация: 1708
Блокировки:
| SirNikolas, А как ты смотришь, скажем, на хексагональные варианты битсета для сейвлоада?
|
|
|
|
SirNikolas | Дата: Среда, 28 Сентября 2011, 19:15:57 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| [DUОS], в save-load'е у меня используется алфавит из 32 знаков, если ты об этом.
|
|
|
|
Hexing | Дата: Среда, 09 Ноября 2011, 16:52:12 | Сообщение # 6 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| версия vJass вызывает фатал еррор+не компилится(ошибки), а JASS2 удалена =(
|
|
|
|
SirNikolas | Дата: Пятница, 11 Ноября 2011, 13:10:17 | Сообщение # 7 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Для vJass требуется JNGP.
|
|
|
|
Hexing | Дата: Пятница, 11 Ноября 2011, 15:33:14 | Сообщение # 8 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| у меня jngp+cjass!!! пожалуйста обновите ссылки(версии ну точн онерабочие, мб там для < 1.24) Ибо описание привлекает
|
|
|
|
SirNikolas | Дата: Пятница, 11 Ноября 2011, 17:23:42 | Сообщение # 9 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Кхм... Очень странно. Попробуй выключить тестовые триггеры - ядро-то точно рабочее. Перезалить в данный момент не могу.
Сообщение отредактировал SirNikolas - Пятница, 11 Ноября 2011, 17:30:37 |
|
|
|
AU | Дата: Пятница, 11 Ноября 2011, 17:43:22 | Сообщение # 10 |
7 уровень
Группа: Проверенные
Сообщений: 471
Награды: 0
Репутация: 70
Блокировки:
| а как насчёт массива целочисленных?
|
|
|
|
SirNikolas | Дата: Суббота, 12 Ноября 2011, 13:06:58 | Сообщение # 11 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| AU, ты про bitset произвольного размера?
|
|
|
|
Hexing | Дата: Воскресенье, 13 Ноября 2011, 09:46:19 | Сообщение # 12 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| поколдовал над кодом, убрал все переходные /* */ для скрытия перехода строки, еще чегото поделал, но остановился на том что он жаловался на: method redeclared destroy или както так короче код не работоспособный
|
|
|
|
SirNikolas | Дата: Вторник, 15 Ноября 2011, 14:31:05 | Сообщение # 13 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Если он жалуется на недопустимое переопределение метода destroy, значит, заголовок структуры надо сменить снаCode struct bitset extends array Добавлено (14 Ноябрь 2011, 13:10:43) --------------------------------------------- Хотя в оригинале она у меня и так от массива наследуется. Похоже, это уже ты стер. Добавлено (15 Ноябрь 2011, 14:31:05) --------------------------------------------- В общем, вот полностью рабочая версия. Скачать v1.0 vJASS
|
|
|
|
Hexing | Дата: Вторник, 15 Ноября 2011, 15:45:11 | Сообщение # 14 |
10 уровень
Группа: Проверенные
Сообщений: 1645
Награды: 1
Репутация: 432
Блокировки:
| ок, спс =)
|
|
|
|