Software Development/Algorithm

비트연산 기초

huiyu 2017. 6. 18. 19:38

-비트연산 : 한개 혹은 두개 이진수에서 비트단위로 적용되는 연산


1. AND(&)
  - 두 값의 각 자릿수를 비교해, 두 값 모두에 1이 있을 때에만 1을, 나머지 경우에는 0을 계산한다.
    : 0100 & 1100 = 0100

2. OR(|)
  - 두 값의 각 자릿수를 비교해, 둘 중 하나라도 1이 있다면 1을, 아니면 0을 계산한다.
    : 0101 | 0011 = 0111

3. XOR(^)
  - 두 값의 각 자릿수를 비교해, 값이 같으면 0, 다르면 1을 계산한다.
    : 0001 ^ 1111 = 1110

4. NOT(~)
  - 각 자릿수의 값을 반대로 바꾸는 연산이다.
   : ~1(0001) = 1110


비트연산의 활용

1. Flag처리 : 비트를 이용하여 상태처리, 
  4Byte = 32Bit, 32개의 상태 처리 가능

왜 Int형으로 사용하지 않는가? 적은 공간에 정보를 저장하고 빠른속도를 필요할때 사용, 대표적으로 CPU

2. Flag 켜기 : |= 연산자 활용

unsigned char flag = 0; //0000 0000
flag |= 1; //0000 0001
flag |= 2; //0000 0011
flag |= 4; //0000 0111
flag |= 8; //0000 1111

3. Flag 켜져있는지 확인 : & 연산자 활용

if(flag & 1) //1번째 flag가 1인지 확인, 켜져있으면 1 꺼져있으면 0 리턴
if(flag & 2)
if(flag & 4)
   ... 

4. Flag 끄기 : &= ~num

flag &= ~1 // 1번 flag 끄기  

  -> 1 = 0000 0001
  -> ~1 = 1111 1110
  -> 1번째 flag가 0이 된상태에서 &연산을 함으로 끄게 된다. 나머지 bit는 변하지 않는다.

5. Flag Toggle : 켜져있으면 키고, 꺼져있으면 끈다. ^= 연산자 활용

 unsigned char flag = 7;//0000 0111
 flag ^= 2; //두번째 bit를 토글해줘!

  -> ^연산자는 값이 같으면 0을, 다르면 1로 만들어주는 비트 연산자이다.
  -> 2(0000 0010)을 7(0000 0111)과 비교하면 -> 5(0000 0101)로 만들어준다.

 flag ^=2;// 다시 토글 하게 되면,

  -> 2(0000 0010) ^ 5(0000 0101) = 7(0000 0111), 다시 켜주게 된다. 즉 켯따 껏다 해준다!

다른 위치의 비트도 마찬가지



 


 flag |= 1  : 0001



*출처/참고
 - 비트연산-위키백과
 - C언어코딩도장- 비트 연산자로 플래그 처리하기

728x90