사실 플래시를 만들 때, && 와 || 이외에는 비트 연산자는 거의 쓸 일이 없습니다.


정확히는 쓸 일이 없다기 보다는, 사용하는(그리고 사용할 줄 아는) 분이 별로 없다보니 코드가 어려워보일 수 있기 때문입니다.
써봐야 이북에 썼던 <<, >> 정도죠...


저또한 거의 쓰지 않고 사는데 아무런 지장(?)이 없는데, 쓸 일이 생겼어요... 게임 클라이언트 개발자가 Boolean 데이터를 묶어서 보내면서, ui쪽에 비트검사를 해줄 것을 요구하더라고요...
위와 같은 이유로 거절을 하고, 풀어 쓸까 했는데, 비(非)전산 아이들(?) 교육용으로 그냥 적용하기로 남겨놨습니다.

그러면서 겸사겸사 이번 포스팅을 올립니다. (원래는 앞서 말했듯 미친듯이 바빠서 포스팅 쓸 시간 없어요...)



이건 프로그램을 배우기 전에도 어릴때(중학수준 정도?), 기술(물리였나?) 시간 등에서 배웠던 놈입니다...(요즘은 기술 시간이 멀로 바꼈다던데...) 


 & 는 둘다 두 비트가 1이여야 1을 반환하고, | 는 둘중 하나만 1이여도 1을 반환하고 ~는 반대를 반환합니다
AND, OR, NOT 이죠...

이론은 아실거라고들 생각하고(구글링 하시길...) 도대체 이걸 어따 써먹나에 집중하겠습니다.



이런 데이터가 있다고 치죠...

b0:Boolean = false;
b1:Boolean = false;
b2:Boolean = true;
b3:Boolean = false;
b4:Boolean = false; 


e-book 의 내용을 보셨다면, 이 녀석을 한데이터로 바꿀 수 있다는 걸 아실겁니다. 

b:ByteArray =  00100;
(플래시에 이렇게 쓸순 없지만 이렇게 표현 가능하다고 치자고요...) 
0번째 비트가 b0, 1번째 비트가 b1, 2번째 비트가 b2... 이렇게 표현하여 하나의 변수에 담을 수 있겠죠...


변수가 수십수백개가 될 수 있는걸 하나로 바꿀 수 있다...가 당연히 끝은 아니고요... 이걸 가지고 작업을 해야겠죠...


b2가 true 인지 false 인지 체크해보겠습니다.

자 다시 b를 uint라고 봅시다.
b:uint =  4입니다...

이렇게 비트를 정수로 변환시키고 싶을 땐 윈도우 계산기를 사용하면 편합니다 

 

위처럼 왼쪽의 모드를 바이너리(Bin)로 바꾸고 이진수를 넣은 다음 다른 모드로 바꾸면 4로 바뀌어 있는걸 보실 수 있습니다...(당연히 그 반대도 가능하겠죠)

어쨌든 그래서 4 입니다

&는 인자가 둘다 1이어야 true 라고 했습니다. 그렇다면 b2가 해당하는 곳에 비트가 1인 놈을 같이 & 연산을 한다면 true임을 알 수 있겠죠?

그럼 이런 수라면 가능합니다...
00100, 100... 등 우측에서부터 2번째(0부터 샜을때 실제로는 3번째)가 1이고 나머지는 0인 숫자를 만들어낸다면 됩니다

   00100
&    100
--------
   00100

이 되는 거니까요...


그러면 이제 100을 어떻게 만들어내느냐인데... 이미 우리는 쉬프트 연산으로 쉬운 방법을 알고 있습니다
1 << 2 이렇게 하면 1을 왼쪽으로 두번 밀어주니 100 이 만들어지죠...


결과적으로 이런 코드가 된겁니다


b:int = 4;
trace(Boolean(b & (1 << 2)))

/////

true

이러면 b2가 true 임을 알 수 있게 된거죠... 클라이언트가 하나의 숫자로 수십개의 Boolean 데이터를 던져줘도 비트 인덱스만 알고 있으면 쉽게 계산이 됩니다.


글이 길어져서 |, 나 ~ 는 생략합니다...(정말 바빠요...ㅠㅠ)

하지만 위에것만 이해해도 당장 응용 정도는 할 수 있으리라 믿으면서...!!!!
(이렇게 어렵게 설명해놓고!!!)




흠... 써놓긴 했는데, 사실 아직도 코드 가독성면에서 이런 비트연산법을 가르치는게 맞는지 모르겠어요... 어렵기만 어렵고 잘 쓰지도 않다보니...
말씀드렸다시피 쓸 생각 없었는데 클라가 요구를 해와서 그냥 겸사겸사입니다...

비트 패러티로 설명을 할까 하다가 저도 네트웍쪽은 잘 몰라서... 그냥 이렇게 설명했습니다


뭐, 하지만 모르는 것보단 낫겠죠???



p.s. 설명이 부족한 분은 구글에서 bitmask 를 검색해주세용~
Posted by 미나토
: