[AS3] Bitwise operacije

Započeo Zarathos, Jul 21, 2015, 11:01:53 PRE PODNE

prethodna tema - sledeća tema

0 članova i 1 gost pregledaju ovu temu.

Bitwise operacije
Brza integer matematika

Disclaimer: Iako u ovoj rubrici nije u listi ActionScript 3, pošto ima sličnosti sa JS-om i skripting je jezik, mislim da je dozvoljeno postati ovaj tutorijal u ovoj rubrici.

Bitwise operacije su izuzetno brze u AS3, i u slijedecem dijelu se nalaze kodovi koji mogu ubrzati odreÄ'ene proračune. Ovdje neću objaÅ¡njavati Å¡ta su bit operatori i kako ih koristiti, za to cu napisati poseban tutorijal za C programski jezik. Svi testovi za performanse (a.k.a benchmark) su uraÄ'eni u AS3.

Shiftanje lijevog bita za mnozenje bilo kojim stepenom dvojke (298% brže)


x = x * 2;
x = x * 64;
/* jednako */

x = x << 1;
x = x << 6;


Shiftanje desnog bita za dijeljenje bilo kojim stepenom dvojke ( 350,4% brže )



x = x / 2;
x = x / 64;

/* jednako */

x = x >> 1;
x = x >> 6;



Konverzija number u integer ( int(x) je 10% brže od bitwise u AS3, dok u AS2 to nije slučaj )



x = int(1.232)

/* jednako */
x = 1.232 >> 0;



Ekstrakcija komponenti boja ( nije baš trik, nego regularan metod ekstrakcije vrijednosti bitwise maskiranjem i shiftanjem )



//24bit
var color:uint = 0x336699;
var r:uint = color >> 16;
var g:uint = color >> 8 & 0xFF;
var b:uint = color & 0xFF;

//32bit
var color:uint = 0xff336699;
var a:uint = color >>> 24;
var r:uint = color >>> 16 & 0xFF;
var g:uint = color >>>  8 & 0xFF;
var b:uint = color & 0xFF;



Kombinacija komponenti boja



//24bit
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = r << 16 | g << 8 | b;

//32bit
var a:uint = 0xff;
var r:uint = 0x33;
var g:uint = 0x66;
var b:uint = 0x99;
var color:uint = a << 24 | r << 16 | g << 8 | b;



Zamjena integera bez pomocne varijable korištenjem XOR logike ( 20% brže, radi i u C++ i C )



var t:int = a;
a = b;
b = t;

/* jednako */
a ^= b;
b ^= a;
a ^= b;



Mijenjanje predznaka korištenjem NOT i XOR logike ( oko ~300% brže )



i = -i;

/* jednako */
i = ~i + 1;

/ * ili */
i = (i ^ -1) + 1;



Provjera da li je broj paran ili nije korištenjem bitwise AND logikom ( ~600% brže )



isEven = (i % 2) == 0;

/* jednako */
isEven = (i & 1) == 0;



Mnogi od ovih kodova rade i u C/C++, zbog slicnosti operatorske logike. Treba imati na umu da su ovo stvari koji otežavaju čitljivost i održavanje koda, te ih treba nekada i izbjegavati.


Just one more time.