학습자료(~2017)/팁

비트연산 - 빠른 정수학

단세포소년 2012. 1. 25. 08:58
반응형
곱하기 연산(2의 배수)
x = x * 2;
x = x * 64;

//equals
x = x << 1;
x = x << 6;


나누기 연산(2의 배수)
x = x / 2;
x = x / 64;

//equals
x = x >> 1;
x = x >> 6;


정수로 변환
x = int(1.232);

//equals
x = 1.222 >> 0;


색 추출
// 24bit
var color:uint = 0xff336699;
var a: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;


색 병합
//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;


임시변수 없이 XOR 을 사용하여 정수 교환
var t:int =a;
a=b;
b=t;

//equals
a ^= b;
b ^= a;
a ^= b;


증감/가감 연산
기본 ++,-- 보다 느리다. 코드를 복잡하게 할 수 있다.
i = -~i; // i++
i = ~-i; // i--


NOT 혹은 XOR을 이용한 부호변환
i = -i;

//equals
i = ~i + 1;

//or
i = (i ^ -1) + 1;


AND 연산을 사용한 나머지 연산
2의 배수로 나눌때만 사용 가능하다.
modulus = numberator & (divisor - 1);

x = 131 % 4;

//equals
x = 131 & (4-1);


절대값구하기
//version 1
i = x < 0 ? -x : x;

//version 2
i = ( x ^ ( x >> 31)) - ( x >> 31);


부호 비교
eqSign = a * b > 0;

//equals
eqSign = a ^ b >=0;

 

출처 : http://lab.polygonal.de
출처 : http://blog.naver.com/PostView.nhn?blogId=c96jks&logNo=130050823702&redirect=Dlog&widgetTypeCall=true


반응형