Сейчас 03:54:43 Четверг, 26 декабря, 2024 год
[ x ] Главная ⇒ Форум ⇐ RSS Файлы Cтатьи Картинки В о й т и   или   з а р е г и с т р и р о в а т ь с я


[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Модератор форума: PUVer, SirNikolas, Ty3uK  
[Библиотека] Битовые сдвиги в WarCraft
SirNikolasДата: Воскресенье, 29 Марта 2015, 16:24:49 | Сообщение # 26
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Цитата Bru ()
Так, а варкрафт вообще позволяет получить размер массива?
Исключительно на стадии компиляции: arr.size. Разумеется, это vJass. Только зачем тебе здесь массивы?

Цитата Bru ()
Это возможно, но, боюсь, будет грузить память.
Мне кажется, ты не понял, что я имел в виду.
Код
int BitAnd(int a, int b) {
     int p = 1;
     int result = 0;
     for (int i = 0) {
         int x = a / 2;
         int y = b / 2;
         if a - x - x == 1 && b - y - y == 1 {
             result += p;
         }
         exitwhen i == 31;
         i++;
         p += p;
         a = x;
         b = y;
     }
     return result;
}
Как-то так. Это без учета отрицательных чисел.

P. S. Не проверялось.


 

BruДата: Воскресенье, 29 Марта 2015, 18:38:06 | Сообщение # 27
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
А-а, вот как.
Цитата SirNikolas ()
Только зачем тебе здесь массивы?

Да я хотел переписать работу со строками на инты. Как бы странно это не звучало =D
 

DuosoraДата: Вторник, 21 Апреля 2015, 18:54:25 | Сообщение # 28
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
Magos в пакете своих функций выкладывал на кампы свою версию битового xor. Вот она:

Код
function BitwiseXOR takes integer Value1, integer Value2 returns integer

  local integer Index
  local integer ResultValue
  local integer array Byte1
  local integer array Byte2
  local integer array ResultByte

  //Convert Value1 to a Byte
  set Index = 8
  loop

    set Index = Index - 1
    set Byte1[Index] = ModuloInteger(Value1, 2)
    set Value1 = Value1 / 2
    exitwhen Index <= 0

  endloop

  //Convert Value2 to a Byte
  set Index = 8
  loop

    set Index = Index - 1
    set Byte2[Index] = ModuloInteger(Value2, 2)
    set Value2 = Value2 / 2
    exitwhen Index <= 0

  endloop

  //Makes a bitwise XOR on the Bytes
  set Index = 0
  loop
    if (Byte1[Index] == Byte2[Index]) then
      set ResultByte[Index] = 0
    else
      set ResultByte[Index] = 1
    endif
    set Index = Index + 1
    exitwhen Index >= 8

  endloop

  //Convert the resulting Byte back to an integer
  set Index = 0
  set ResultValue = 0
  loop

    set ResultValue = ResultValue * 2
    set ResultValue = ResultValue + ResultByte[Index]
    set Index = Index + 1
    exitwhen Index >= 8

  endloop

  return ResultValue

endfunction


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.
 

BruДата: Четверг, 23 Апреля 2015, 21:39:47 | Сообщение # 29
i<3bo4k@
Группа: Акулы
Сообщений: 4750
Награды: 2
Репутация: 1960
Блокировки:
Нашел такую интересную вещь - http://vk.com/wall-30666517_1127706
 

SirNikolasДата: Четверг, 23 Апреля 2015, 23:02:53 | Сообщение # 30
Группа: Модераторы
Сообщений: 6729
Награды: 1
Репутация: 1867
Блокировки:
Вещь действительно весьма занятная, однако в данном случае не помогла. Максимум, что, по ее мнению, здесь возможно - выразить одну битовую операцию через какую-нибудь другую.

 

DuosoraДата: Пятница, 24 Апреля 2015, 18:12:16 | Сообщение # 31
The cats never sleep...
Группа: Ветераны
Сообщений: 6734
Награды: 10
Репутация: 2161
Блокировки:
Код
library BitOperations initializer Init
      globals
          // Warcraft 3 uses 32-bit signed integers.
          private constant integer       BITS_IN_INTEGER = 32
            
          private          integer array Pow2[BITS_IN_INTEGER]
      endglobals

      // BitwiseNot(a) = ~a in C++
      function BitwiseNot takes integer a returns integer
          return -1-x
      endfunction
        
      // LeftShift(a,bitCount) = a << bitCount in C++
      function LeftShift takes integer a, integer bitCount returns integer
          return a*Pow2[bitCount]
      endfunction
        
      // RightShift(a,bitCount) = a >> bitCount in C++
      function RightShift takes integer a, integer bitCount returns integer
          return a/Pow2[bitCount]
      endfunction
        
      // BitwiseAnd(a,b) = a&b in C++
      function BitwiseAnd takes integer a, integer b returns integer
          local integer aBit     // Bit of a;
          local integer bBit     // Bit of b;
          local integer rBit     // Bit of result
          local integer r    = 0 // result
            
          loop
              exitwhen i==BITS_IN_INTEGER
              set aBit = ModuloInteger(a, 2)
        set bBit = ModuloInteger(b, 2)
          
        if aBit == 1 and bBit == 1 then
                  set rBit = 1
              else
                  set Bit = 0
              endif   
                
              set r = r + LeftShift(rBit,i)
          
        set a = a / 2
        set b = b / 2
              set i = i + 1
          endloop
            
          return r
      endfunction
        
      // BitwiseOr(a,b) = a|b in C++
      function BitwiseOr takes integer a, integer b returns integer
          local integer aBit     // Bit of a
          local integer bBit     // Bit of b
          local integer rBit     // Bit of result
          local integer r    = 0 // result
            
          loop
              exitwhen i==BITS_IN_INTEGER
              set aBit = ModuloInteger(a, 2)
        set bBit = ModuloInteger(b, 2)
          
        if aBit == 1 or bBit == 1 then
         set rBit = 1
        else
               set rBit = 0
        endif
          
        set r = r + LeftShift(rBit,i)
          
        set a = a / 2
        set b = b / 2
              set i = i + 1
          endloop
            
          return r
      endfunction
        
      // BitwiseXor(a,b) = a^b in C++
      function BitwiseXor takes integer a, integer b returns integer
          local integer aBit     // Bit of a
          local integer bBit     // Bit of b
          local integer rBit     // Bit of result
          local integer r    = 0 // result
            
          loop
              exitwhen i==BITS_IN_INTEGER
              set aBit = ModuloInteger(a, 2)
        set bBit = ModuloInteger(b, 2)
          
        if aBit != bBit then
            set rBit = 1
        else
         set rBit = 0
        endif
          
        set r = r + LeftShift(rBit,i)
          
        set a = a / 2
        set b = b / 2
              set i = i + 1
          endloop
            
          return r
      endfunction

      private function Init takes nothing returns nothing
          local integer i = 1
            
          // Pre-init the power of two array to speed up the system.
          set Pow2[0] = 1
          loop
              exitwhen i > BITS_IN_INTEGER-1
              set Pow2[i] = Pow2[i-1]*2
              set i = i + 1
          endloop      
      endfunction
endlibrary

Обновлённая библиотека и ссылка о том, как улучшить And, Or, Xor.

Альтернативная библиотека с wc3c:
Код
library Binary initializer InitBinary

globals
   private integer array bintable
   // Offsets:
   // 0x000 = powers of 2 (up to 32)
   // 0x100 = AND
   // 0x200 = OR
   // 0x300 = XOR
endglobals

// just hope it gets inlined in future
function NOT takes integer a returns integer
   return -1 - a
endfunction
// binary operations use lookup tables for 4-bit blocks
function AND takes integer a, integer b returns integer
   local integer ta = a / 16
   local integer tb = b / 16
   local integer x = bintable[0x100 + (a - ta * 16) + (b - tb * 16) * 16]
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x100 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00000010
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x100 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00000100
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x100 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00001000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x100 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00010000
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x100 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00100000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x100 + (a - ta * 16) + (b - tb * 16) * 16] * 0x01000000
   set a = ta / 16
   set b = tb / 16
   return x + bintable[0x100 + (ta - a * 16) + (tb - b * 16) * 16] * 0x10000000
endfunction
function OR takes integer a, integer b returns integer
   local integer ta = a / 16
   local integer tb = b / 16
   local integer x = bintable[0x200 + (a - ta * 16) + (b - tb * 16) * 16]
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x200 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00000010
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x200 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00000100
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x200 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00001000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x200 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00010000
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x200 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00100000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x200 + (a - ta * 16) + (b - tb * 16) * 16] * 0x01000000
   set a = ta / 16
   set b = tb / 16
   return x + bintable[0x200 + (ta - a * 16) + (tb - b * 16) * 16] * 0x10000000
endfunction
function XOR takes integer a, integer b returns integer
   local integer ta = a / 16
   local integer tb = b / 16
   local integer x = bintable[0x300 + (a - ta * 16) + (b - tb * 16) * 16]
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x300 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00000010
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x300 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00000100
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x300 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00001000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x300 + (a - ta * 16) + (b - tb * 16) * 16] * 0x00010000
   set a = ta / 16
   set b = tb / 16
   set x = x + bintable[0x300 + (ta - a * 16) + (tb - b * 16) * 16] * 0x00100000
   set ta = a / 16
   set tb = b / 16
   set x = x + bintable[0x300 + (a - ta * 16) + (b - tb * 16) * 16] * 0x01000000
   set a = ta / 16
   set b = tb / 16
   return x + bintable[0x300 + (ta - a * 16) + (tb - b * 16) * 16] * 0x10000000
endfunction
// shift left/right. DO NOT use negative values, this should get inlined as well
function SHL takes integer a, integer b returns integer
   return a * bintable[b]
endfunction
function SHR takes integer a, integer b returns integer
   return a / bintable[b]
endfunction

private function InitBinary takes nothing returns nothing
   local integer i = 0
   local integer a
   local integer b
   local integer ta
   local integer tb
   loop
     exitwhen i >= 256
     set a = i / 16
     set b = i - a * 16
     set ta = a - (a / 2) * 2
     set tb = b - (b / 2) * 2
     set bintable[0x100 + i] = ta * tb
     set bintable[0x200 + i] = ta + tb - ta * tb
     set bintable[0x300 + i] = ta + tb - 2 * ta * tb
     set a = a / 2
     set b = b / 2
     set ta = a - (a / 2) * 2
     set tb = b - (b / 2) * 2
     set bintable[0x100 + i] = bintable[0x100 + i] + 2 * (ta * tb)
     set bintable[0x200 + i] = bintable[0x200 + i] + 2 * (ta + tb - ta * tb)
     set bintable[0x300 + i] = bintable[0x300 + i] + 2 * (ta + tb - 2 * ta * tb)
     set a = a / 2
     set b = b / 2
     set ta = a - (a / 2) * 2
     set tb = b - (b / 2) * 2
     set bintable[0x100 + i] = bintable[0x100 + i] + 4 * (ta * tb)
     set bintable[0x200 + i] = bintable[0x200 + i] + 4 * (ta + tb - ta * tb)
     set bintable[0x300 + i] = bintable[0x300 + i] + 4 * (ta + tb - 2 * ta * tb)
     set ta = a / 2
     set tb = b / 2
     set bintable[0x100 + i] = bintable[0x100 + i] + 8 * (ta * tb)
     set bintable[0x200 + i] = bintable[0x200 + i] + 8 * (ta + tb - ta * tb)
     set bintable[0x300 + i] = bintable[0x300 + i] + 8 * (ta + tb - 2 * ta * tb)
     set i = i + 1
   endloop
   set i = 1
   set bintable[0] = 1
   loop
     exitwhen i > 31
     set bintable[i] = bintable[i - 1] * 2
     set i = i + 1
   endloop
endfunction
endlibrary


Не зли других и сам не злись.
Мы - гости в этом мире.
И если что не так - смирись,
Будь поумнее - улыбнись,
Ведь в мире всё закономерно.
Зло, излучённое тобой,
К тебе вернётся непременно.


Сообщение отредактировал Duosora - Пятница, 24 Апреля 2015, 18:59:15
 

Samedy_Дата: Воскресенье, 14 Июня 2015, 21:24:16 | Сообщение # 32
7 уровень
Группа: Проверенные
Сообщений: 371
Награды: 0
Репутация: 18
Блокировки:
Цитата Bru ()
Кстати, может кому надо, подсветка синтаксиса JASS/cJass/vJass/ZINC для Sublime Text 2/TextMate.
https://www.dropbox.com/s/25flyocjef3tddy/jass.tmLanguage?dl=0

Вот это нифига себе. А авто-ввод запилить кто-нибудь могет?
для аутистов, вроде меня


Сообщение отредактировал Samedy_ - Воскресенье, 14 Июня 2015, 21:24:39
 

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

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