Friday, October 29, 2010

bit 연산자

-사례 1
context.Dr7 |= 1 << (available * 2)
"파이썬 해킹 프로그래밍"이라는 책을 보고 있는데 하드포인트브레이크를 설정할때 위와 같은 구절이 나온다. 도대체 |= 는 뭔가? 평소에 잘 보지 않은 연산자로 보아 비트 연산자 일거고.. 사실 위의 구절이 하려는 의도(디버그 레지스터인 Dr7는 0~3까지 디버그 레지스터인 Dr0~3까지의스위치 역할을 하기에 0~3번째 위치의 bit 를 on 해주기 위한 것)를 이미 알기에 대략 추측을 햇지만.. << 는 비트를 왼쪽으로 미는것일거고 |=는 다양한 시도 끝에.. 아 bitwise or인 | 를 실행 시키고 그 결과를 대입 연산자 = 를 통해 다시 context.Dr7에 넣는구나라는 것을 깨달았다.


available 이 1이라고 가정하고 bin(context.Dr7) =  0b1010이라고 하면 1<< (1*2) 이므로 bin(1<<(available*2)) = 0b100 이 될 것이기에 0b1010과 0b100을 bitwise or로 하면 0b1110이 될것이고 그 값이 Dr7에 들어 가게 된다.


결과적으로 변수의 특정 위치(그러니까 그 변수의 특정 포지션의 bit)에 특정값을 밀어 넣는다고 생각하면 된다.


 -사례 2
전에 포스팅한 reference free short read validation의 논문의 quarc인가 하는 프로그램을 들여다 보면 K-mer 를 int 형 배열에 넣는데, K-mer에 K를 2라고 가정하면 종류가 최대 4**2=16가지의 K-mer 가 생성되기때문에 
_base2int = int[16]
d_base = {'A':0, 'G':1, 'C':2, 'T':3} 으로 해서 "AC" 라는 K-mer가 있으면 value= 0 으로 초기화 한뒤 value += d_base['A'] ; value = value << 2; value += d_base['C'] 식으로 각 K-mer의 index value를 만드뒤 이 값을 이용해서 _base2int의 값에 접근.

No comments:

Post a Comment