본문 바로가기

(임시휴재) Fanta's Post

비트연산 활용

모두들 비트연산은 그냥 안배우고 넘어가셨겟죠.(그렇다고 말해줘요)

비트연산은 &, |, ^, ~, <<, >>가 있습니다.

식상한 설명

 &  AND  둘 다 1이면 1
 |  OR  하나만 1이면 1
 ^  XOR  다르면 1
 ~  NOT  1이면 0, 0이면 1
 <<  LEFT SHIFT  왼쪽으로 비트이동
 >>  RIGHT SHIFT  오른쪽으로 비트이동


비트란 말이 생소하다면.
32비트 정수형 변수라고 불리는 int는 32자리의 2진수로 구성되어있습니다.

4102100 = 11 1110 1001 0111 1101 0100

비트연산은 이진수에대한 숫자놀음과 같습니다.



&
  • 원하는 비트만 변경
만약 32비트에서 4번째와 16번째 비트만 1로 만들고 싶을 땐
a=0x10010000
0x는 16진수를 나타내고 0x10010000는 2진수로 0001 0000 0000 0001 0000 0000 0000 0000입니다.
4번째 비트랑 16번째 비트만 1이죠.
예)
   0011 1100 0011 1011 1001 1000 0001 1111
& 0001 0000 0000 0001 0000 0000 0000 0000
= 0001 0000 0000 0001 0000 0000 0000 0000

  • 공통부분 구하기
이건 약간 제한된 경우지만 에라토스테네스의 체를 이용하여 소수를 구할 때 처럼 배열에 1과 0만 넣어 참, 거짓을 구별할 때 if문을 사용하는 것 보다 빠르게 작업을 해냅니다.
이 함수는 C언어 스도쿠 자동풀이 프로그램에서 아주 자알 사용되었습니다.


|
  • 원하는 비트를 1로 바꾸고 싶을 때
&연신처럼 사용하세요.

^
  • 값 교환 (이건 느리다고 하네요.)
a^=b;
b^=a;
a^=b;
이 세 번의동작을 하면 a와 b의 값이 바뀝니다.

0으로 초기화할 때
a^=a 를 하면 a가 0으로 초기화됩니다. (쓸 일이 없어요.)



~
  • 정수형 변수의 최댓값을 구하고 싶을 때

가장 오른쪽의 비트를 가장 왼쪽으로 이동시키고 ~연산으로 가장 왼쪽비트만 빼고 전부 1로 만들어 최대값을 출력합니다. (부호있는 변수는 가장 왼쪽의 비트는 음수를 나타낼 때 사용됩니다.)



<<, >>
      • << 2n으로 곱할 때 (빨라요.)
      • >> 2n으로 나눌 때

10진수를 예로 설명한다면
00000020(이십)을 왼쪽으로 2칸 옮기면 00002000(이천)이 되죠. 10진수에선 10n만큼 곱해지거나 나누어집니다.
21로 계속 곱하는 소스 
 

'(임시휴재) Fanta's Post' 카테고리의 다른 글

A la russe 곱셈 알고리즘  (0) 2009.04.04
이번주는 쉽니다.  (1) 2009.03.28
최대공약수와 최소공배수  (0) 2009.03.14
Bit twiddling Hack : 정수의 부호 계산  (0) 2009.02.28
변수의 범위  (3) 2009.02.21