2010년 1월 28일 목요일

비트연산

- 1의 보수와 비트단위 부정 : ~
   : 단항 연산자 ~는 다음 예제처럼 1을 0으로 0을 1로 바꾼다. 원래 값은 변하지 않는다.

~(10011010) // 표현식
  (01100101) // 결과값

- 비트단위 AND: &
   : 이항 연산자이고 두 개의 피연산자간의 비트끼리 비교한다. 같은 위치의 두 수다 1이어야지만 결과값이 1이고 둘중 하나 또는 둘다 0일때는 결과값은 0이된다.

   (10010011)
& (00111101) // 표현식
-------------------------
   (00010001) // 결과값

val &= 0377;  // 결과값을 할당한다.

- 비트 단위 OR : |
   : 이항 연산자이고 두 개의 수중 하나라도 1이면 결과값은 1이다. 즉, 둘다 0 이 아닌 이상 결과값은 1이 되는것이다.

  (10010011)
| (00111101) // 표현식
-------------------------
  (10111111) // 결과값

val |= 0377; // 결과값을 할당한다.

- 비트단위 Exclusive OR: ^
   : 이항 연산자이고 두 개의 수가 서로 달라야지만 1이 된다. 1,1 또는 0,0은 서로 같으므로 결과값은 0이 되고 1,0 또는 0,1 은 값이 서로 다르므로 결과값은 1이 된다.

  (10010011)
^ (00111101) // 표현식
-------------------------
  (10101110) // 결과값

val ^= 0377; //결과값을 할당한다.

마스크
: 어떤 값에서 특정값에 대한 결과값을 확인할  수 있다. 마스크 값과 플래그값을 &연산수행.

  MASK : (00000011)
& FLAG : (10010110)
-------------------------
              (00000010)

위와 같은 경우 MASK 값의 나머지 값들을 0으로 초기화 한다. &연산시 0과 결합하는 비트는 모두 0이 되기 때문이다. 두번째 비트가 같다는걸 확인할 수 있다.

- 비트 on
: 나머지 비트는 변경하지 않고 특정값만 on(1)시킬때 사용 된다. 해당 값에 | 연산을 수행한다. 그때 비트 on 하고자 하는 값은 1로 설정한다. or연산시 둘중 하나만 1이여도 결과값은 1이 되기 때문이다. 결과적으로 특정 비트만 on시킬 수 있게 된다.

- 비트 off
: 비트 on과 반대로 나머지 비트는 건드리지 않고 특정비트만 off(0)시킬때 사용된다.
예제를 보자

FLAGS = FLAGS & ~MASK   ==  FLAGS &= ~MASK

~MASK의 경우 비트 1은 0으로 비트 0은 1로 바뀐다 . 그 값에서 &연산을 사용해서 처리한다

MASK : ~(00000010)  // 우선 비트 off해야할 값을 xor한다.
-------------------------
              (11111101) // xor한 결과값이다.

위의 결과값을 FLAG값과 &연산을 수행 한다.

  MASK : (11111101) // xor한 결과값
& FLAG : (00001111)  //
-------------------------
              (00001101) // 결과값

처음 (00001111) 이던 값이 변경하고자 했던 두번째 비트 값을 0으로 바꿔버렸다.
결론적으로 특정비트를 off(0)시킨 결과가 나오게 된다. :)

- 비트 토글링
: on(1)을 off(0)로 off(0)를 on(1)으로 토글할 수 있는 것이다.
번뜩 스쳐지나가는게 있을 것이다. 단항연산자인 ~연산자. 이는 모든 비트를 토글 시켜버린다. 지금 하고자하는건 특정 비트만 토글 시키고자 하는 것이므로 ~는 제외한다.
XOR 연산을 하면 되는 것이다.

00001111 ^ 00000010 하면 결과는 00001101로 두번째 비트만 off(0)시키는 결과가 나온다. ;)

비트값 점검
: 말그대로 비트가 제대로 변경되었는지 점검하고자 하는것이다.

if(flag == MASK)
   puts("Oops!");   //특정비트가 같더라도 다른비트 때문에 정확한 결과가 나오지 않는다.

if((flag & MASK) == MASK)
   puts("Wow!");

위와 같이 해 주면 되는것이다. :)




댓글 없음:

댓글 쓰기