Я сделал две версии - для 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()
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 можно не только через .create():
Code
local bitset bs = bitset.create()//Создает bitset с нулевым начальным значением
local bitset bs2 = bitset.initialize(10)//Создает объект и присваивает начальное значение 10
local bitset bs3 = bitset.parse("10100")//Создает объект и присваивает начальное значение, соответствующее переданной двоичной строке, т. е. 20
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()
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()
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