Сейчас 22:59:19 Пятница, 22 ноября, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Система] 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
на
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
Блокировки:
ок, спс =)

 

  • Страница 1 из 1
  • 1
Поиск:

Copyright © 2006 - 2024 Warcraft3FT.info При копировании материалов c сайта ставьте, пожалуйста, активную обратную ссылку на нас • Design by gReeB04ki ©
Хостинг от uCoz