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


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

avtorklif
Ппц
 

ВолчачкаДата: Воскресенье, 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 facepalm
В общем, вот рабочая функция для перевода десятичного числа в двоичное:
Код

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
Блокировки:
ну и нахрен это нужно?

CM wars 1.15
ЭПОХА АНИМИРОВАННЫХ ТРИГГИРАФ ПРЕШЛА
 

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)
---------------------------------------------
Так, а варкрафт вообще позволяет получить размер массива?

 

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

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