[Библиотека] Битовые сдвиги в WarCraft
|
|
Duosora | Дата: Пятница, 20 Марта 2015, 23:22:24 | Сообщение # 1 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Код library BitShifting initializer Init globals private integer array PowerOfTwo[12] endglobals
function ShiftLeft takes integer x, integer bits returns integer return x*PowerOfTwo[bits] endfunction
function ShiftRight takes integer x, integer bits returns integer return x/PowerOfTwo[bits] endfunction private function Init takes nothing returns nothing local integer i = 0 loop exitwhen i > 11 set PowerOfTwo[i] = Pow(2,i) set i=i+1 endloop endfunction endlibrary
Написал простую библиотечку для реализации битового сдвига в варкрафте. Хотел бы узнать мнения знающих людей о том, как можно её оптимизировать. =)
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
Волчачка | Дата: Суббота, 21 Марта 2015, 00:15:59 | Сообщение # 2 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Если честно, пока такой способ будет оптимальнее.
Сообщение отредактировал Волчачка - Суббота, 21 Марта 2015, 01:47:01 |
|
|
|
SirNikolas | Дата: Суббота, 21 Марта 2015, 12:29:50 | Сообщение # 3 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Код local integer i = 1 set PowerOfTwo[0] = 1 loop set PowerOfTwo[i] = PowerOfTwo[i - 1] * 2 exitwhen i == 31 set i = i + 1 endloop Маловато как-то, давай тогда сразу все битовые операции.
|
|
|
|
Duosora | Дата: Суббота, 21 Марта 2015, 17:04:07 | Сообщение # 4 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата SirNikolas ( ) Маловато как-то, давай тогда сразу все битовые операции. Благодарю за хорошую оптимизацию.
Какие конкретно ещё битовые операции желается увидеть? Нечто вроде >>> или <<< ?
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
|
|
|
|
SirNikolas | Дата: Суббота, 21 Марта 2015, 18:53:03 | Сообщение # 5 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Традиционные: and, or, xor, flip. Можешь и >>>, раз вспомнил.
|
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 11:51:29 | Сообщение # 6 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Что-то я не пойму, почему функция не пашет. При вызове dectobin(15) единственный вывод на экран - 15. Цикл дальше первого прохода не идет - почему? Код function decToBin takes integer d returns string local integer decimal = d local string binary local integer temp loop call BJDebugMsg(I2S(decimal)) if(decimal == 1) then set decimal = 0 set binary = binary + "1" else set temp = ModuloInteger(decimal,2) set binary = binary + I2S(decimal - temp*2) set decimal = temp endif exitwhen decimal == 0 endloop return binary endfunction
|
|
|
|
Волчачка | Дата: Воскресенье, 22 Марта 2015, 13:05:54 | Сообщение # 7 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Bru, може потому, что decilmal не сокращается)000 Допустим 1010 10/2 0 5/2 1 2/2 0 1/2 1 -> 10102 Допустим 1510 15/2 1 7/ 2 1 3/2 1 1/2 1 -> 11112
Сообщение отредактировал Волчачка - Воскресенье, 22 Марта 2015, 13:30:47 |
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 13:31:40 | Сообщение # 8 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Мдамс, что-то я напутал Добавлено (22 Марта 2015, 13:27:21) --------------------------------------------- Хотя нет, все верно же. decimal уменьшается. Становится 7,3, 1 и в итоге 0. Точнее, должен уменьшатся. Но цикл дальше первого раза и не думает идти. Почему? Добавлено (22 Марта 2015, 13:31:40) --------------------------------------------- Дурацкий JASS, как тошно им пользоваться после двух лет на C++/C#
|
|
|
|
Волчачка | Дата: Воскресенье, 22 Марта 2015, 13:40:24 | Сообщение # 9 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Цитата Bru ( ) set binary = binary + I2S(decimal - temp*2) Код set binary = I2S(decimal - temp*2) + binary Цитата Bru ( ) local string binary Код local string binary = "" :D
Сообщение отредактировал Волчачка - Воскресенье, 22 Марта 2015, 13:41:10 |
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 13:49:57 | Сообщение # 10 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Цитата Волчачка ( ) local string binary = "" Ппц
|
|
|
|
Волчачка | Дата: Воскресенье, 22 Марта 2015, 13:55:29 | Сообщение # 11 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Bru, Код function decToBin takes integer d returns string local integer decimal = d local string binary = "" local integer temp loop exitwhen decimal == -1 if decimal != 0 then set temp = ModuloInteger(decimal,2) set binary = I2S(temp) + binary set decimal = decimal / 2 else set binary = "1" + binary set decimal = -1 endif endloop return binary endfunction Добавлено (22 Марта 2015, 13:55:29) ---------------------------------------------
Цитата Bru ( ) avtorklif Ппц 11110000 10000111 11011011 11000101 11001100, 11001110 11000001 11001000 11010101 11001010 (N2->N10->ASCII) :D
Сообщение отредактировал Волчачка - Воскресенье, 22 Марта 2015, 13:54:13 |
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 14:04:57 | Сообщение # 12 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| До меня дошло. 15%2=1, а не 7 В общем, вот рабочая функция для перевода десятичного числа в двоичное: Код function decToBin takes integer decimal returns string local string binary = "" local integer modulus loop set modulus = ModuloInteger( decimal, 2 ) set binary = I2S( modulus ) + binary set decimal = ( decimal - modulus ) / 2 exitwhen decimal == 0 endloop return binary endfunction
Сообщение отредактировал Bru - Воскресенье, 22 Марта 2015, 14:06:12 |
|
|
|
Волчачка | Дата: Воскресенье, 22 Марта 2015, 14:24:28 | Сообщение # 13 |
САЙТ УМЕР ППЦ
Группа: Проверенные
Сообщений: 1361
Награды: 0
Репутация: 2165
Блокировки:
| Bru, а теперь напиши функу BinToDec :)
|
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 16:03:30 | Сообщение # 14 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Для начала, проверка строки содержащей двоичные данные на валидность: Код function validateBin takes string binary returns boolean local integer i = 0
loop if ( (SubString(binary, i, i+1) != "1") and (SubString(binary, i, i+1) != "0") ) then return false endif exitwhen i == StringLength(binary) - 1 i = i+1 endloop
return true endfunction Добавлено (22 Марта 2015, 16:03:30) --------------------------------------------- bintodec тоже готов. Все три функции вместе.
|
|
|
|
Melodia | Дата: Воскресенье, 22 Марта 2015, 20:20:18 | Сообщение # 15 |
Группа: Проверенные
Сообщений: 8026
Награды: 5
Репутация: 5051
Блокировки:
| ну и нахрен это нужно?
|
|
|
|
Bru | Дата: Воскресенье, 22 Марта 2015, 21:19:27 | Сообщение # 16 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Melodia, конкретно мои три функции - для xor'a, xor для rand'a, а зачем rand - кто знает.
|
|
|
|
abidin | Дата: Пятница, 27 Марта 2015, 08:16:13 | Сообщение # 17 |
7 уровень
Группа: Проверенные
Сообщений: 330
Награды: 0
Репутация: 305
Блокировки:
| Melodia, типо операция деления и умножения. Ну у Дуоса, а Bru написал что-то бесполезное.
|
|
|
|
Duosora | Дата: Пятница, 27 Марта 2015, 11:31:34 | Сообщение # 18 |
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
| Цитата abidin ( ) Bru написал что-то бесполезное. Поспорю. У Бру не бесполезные функции, просто глупо расходуют ресурсы, требуемые на их выполнение. Закономерность функции xor Находкой ещё давно поделился IyD
Существует два числа - а и b. Увеличивая их на 1 (начиная с нуля), можно заметить следующую закономерность: a xor b при изменении b и фиксированном a обладает таким свойством: a xor b = a + x, где х равен:
1: 1 -1... 2: 2 2 -2 -2... 4: 4 4 4 4 -4 -4 -4 -4... 8: 8 8 8 8 8 8 8 8 -8 -8 -8 -8 -8 -8 -8 -8...
Для последующих степеней двойки действует принцип: 2n чисел 2n, затем ещё 2n чисел -(2n). Для всех остальных чисел ряд будет заключаться в сумме рядов между числами 2n, то есть для ряда 3 (x=3) надо просуммировать 1 и 2. Результат:
3: (1+2) (-1+2) (1-2) (-1-2)... или же 3: 3 1 -1 -3...
Если свернуть эту закономерность в формулу, можно написать на текущий момент наилучший вариант xor (не использующий нагруженные циклы), который возможен в варкрафте. Если у кого-то есть идеи, как это сделать - пишите. Во всяком случае, это точно не потребует конвертации в двоичку.
Не зли других и сам не злись. Мы - гости в этом мире. И если что не так - смирись, Будь поумнее - улыбнись, Ведь в мире всё закономерно. Зло, излучённое тобой, К тебе вернётся непременно.
Сообщение отредактировал Duosora - Пятница, 27 Марта 2015, 11:32:28 |
|
|
|
Bru | Дата: Пятница, 27 Марта 2015, 13:34:10 | Сообщение # 19 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Цитата Duosora ( ) Поспорю. У Бру не бесполезные функции, просто глупо расходуют ресурсы, требуемые на их выполнение. Что ты предлагаешь? Можно использовать массив чисел вместо строки, но даст ли это прирост в производительности? Бесит JASS. Цитата Duosora ( ) Закономерность функции xor Что-то с трудом себе представляю реализацию этого способа.
Сообщение отредактировал Bru - Пятница, 27 Марта 2015, 13:34:20 |
|
|
|
SirNikolas | Дата: Пятница, 27 Марта 2015, 16:59:43 | Сообщение # 20 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Duosora, непонятно. Можно еще раз?
Если в формулу не получится, можно просто пройтись циклом по всем битам числа.
|
|
|
|
Bru | Дата: Пятница, 27 Марта 2015, 18:30:55 | Сообщение # 21 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Цитата SirNikolas ( ) Если в формулу не получится, можно просто пройтись циклом по всем битам числа. Этот способ очевиден, однако Цитата Duosora ( ) не использующий нагруженные циклы Цитата Duosora ( ) Во всяком случае, это точно не потребует конвертации в двоичку.
Добавлено (27 Марта 2015, 18:30:55) --------------------------------------------- Кстати, может кому надо, подсветка синтаксиса JASS/cJass/vJass/ZINC для Sublime Text 2/TextMate. https://www.dropbox.com/s/25flyocjef3tddy/jass.tmLanguage?dl=0
Сообщение отредактировал Bru - Пятница, 27 Марта 2015, 18:36:55 |
|
|
|
SirNikolas | Дата: Суббота, 28 Марта 2015, 01:57:20 | Сообщение # 22 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата Bru ( ) Кстати, может, кому надо, подсветка синтаксиса JASS/cJass/vJass/ZINC для Sublime Text 2/TextMate. О, спасибо большое.Цитата Duosora ( ) не использующий нагруженные циклы 32 итерации всего.Цитата Duosora ( ) Во всяком случае, это точно не потребует конвертации в двоичку. Я и не собирался конвертировать в строку.
|
|
|
|
Bru | Дата: Суббота, 28 Марта 2015, 10:12:45 | Сообщение # 23 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Цитата SirNikolas ( ) О, спасибо большое. Пожалуйста. Цитата SirNikolas ( ) Я и не собирался конвертировать в строку. Ты предлагаешь оставлять в int'е? В принципе, для чисел в двоичной системе это имеет смысл, но что, если понадобится использовать не-числа? К примеру, что-то вроде 00010010.
|
|
|
|
SirNikolas | Дата: Суббота, 28 Марта 2015, 12:59:42 | Сообщение # 24 |
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
| Цитата Bru ( ) 00010010 Это строка? Для работы с двоичными строками ты же написал необходимые функции, включая конвертацию в int. Вопрос в том, что надо работать с int'ами, не прибегая к строкам.
|
|
|
|
Bru | Дата: Суббота, 28 Марта 2015, 19:08:52 | Сообщение # 25 |
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
| Это возможно, но, боюсь, будет грузить память. Добавлено (28 Марта 2015, 19:08:52) --------------------------------------------- Так, а варкрафт вообще позволяет получить размер массива?
|
|
|
|