언어/기타
2006.10.05 07:01

비트 연산자

조회 수 471 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제

비트별 연산자


비트별 연산자는 비트단위 연산을 할때 쓰이는 연산자 입니다.


먼저 비트별 연산자의 종류를 알아보죠.


비트별 연산자에는 다음과 같은 것 들이 있습니다.

------------------------------
&   AND (비트별 논리곱)
|   OR (비트별 논리합)
^   XOR (비트별 배타 논리합)
~   1의 보수
<<  왼쪽으로 쉬프트
>>  오른쪽으로 쉬프트
------------------------------



다음과 같은 것들이 있는데 하나씩 자세히 알아보죠.


(1) 비트별 논리곱


&는 비트 단위로 AND연산을 하는 건데,


연산하려는 두 개의 비트가 모두 1일때만 결과가 1이 되고


하나라도 0이면 결과는 0이 됨니다.


정리하면

------------------------------------
첫번째 비트   두번째 비트     결과
------------------------------------
     1       &      1           1
     1       &      0           0
     0       &      1           0
     0       &      0           0
-----------------------------------



이렇게 되죠


한가지 문제를 드리죠


0x0F & 0xFF = ?


알아맞춰 보세요.


답은 0x0F죠.


0x0F는 이진수로 00001111입니다. 0xFF는 11111111이죠.


그런데 &연산자는 모두 1일때만 1을 돌려 줌니다.


00001111과 11111111에서 모두 1인 부분은 뒤쪽 4개의 비트죠.


그러므로 결과는 00001111


이걸 16진수로 고치면 0x0F가 되죠.


다시 정리하면

-----------------------------
   0x0F = 00001111
   0xFF = 11111111
         ---------- (& 연산)
          00001111 = 0x0F
-----------------------------



이해가 되시죠?


(2) 비트별 논리합


다음으로 |연산자에 대해 자세히 알아보죠.


|는 OR연산을 하는 것으로 &와는 달리 두개의 비트중 1개라도 1이면


1을 돌려주는 연산자 입니다.



------------------------------------
첫번째 비트   두번째 비트     결과
------------------------------------
     1       |      1           1
     1       |      0           1
     0       |      1           1
     0       |      0           0
------------------------------------



이런 연산을 하는 연산자 입니다.


그럼 이것두 문제를 드릴까요?


아까처럼 0x0F와 0xFF를 쓰도록 하죠


그런데 이 두개를 OR연산 하면 어떤 결과가 나올까요?


당연히 0xFF죠.


이유는 하나라도 1이면 1을 돌려 주므로.

-----------------------------
   0x0F = 00001111
   0xFF = 11111111
         ---------- (| 연산)
          11111111 = 0xFF
-----------------------------



이렇게 되기 때문이죠.


(3) 비트별 배타 논리합


다음으로 ^연산자에 대해 알아보죠.


^는 비트단위 배타 OR연산 즉 비트단위 XOR연산을 하는 연산자 입니다.


이 연산자는 OR비슷하지만, 다른점은 두개의 비트가 모두 1일때는


0을 돌려준다는 것이죠.


OR에서는 1을 돌려주지만


즉..

------------------------------------
첫번째 비트   두번째 비트     결과
------------------------------------
     1       ^      1           0
     1       ^      0           1
     0       ^      1           1
     0       ^      &           0
------------------------------------

다음과 같은 연산을 하게 됨니다.


그럼 이번엔 0x0F와 0xFF를 XOR연산 하면 어떤 결과가 나올까요?


이건

-----------------------------
   0x0F = 00001111
   0xFF = 11111111
         ---------- (| 연산)
          11110000 = 0xF0
-----------------------------



이렇게 해서 0xF0이 나오게 됨니다.


(4) 1의 보수


다음으로 ^연산자에 대해 알아보죠.


^는 1의 보수를 구하는 연산자로 그냥 쉽게 비트들을 반대로


즉 0이면 1로 1이면 0으로 바꿔버린다고 알고계시면 됨니다.

-----------------------
      비트     결과
-----------------------
  ~    0         1
  ~    1         0
-----------------------



이런 연산을 하는 것이죠.


1의 보수 연산을 잘 쓰면 좋은점이 많이 있습니다.


만약 여러분이 unsigned long가 가질수 있는 가장 큰 값을 써야 할 경우


어떻게 할까요?


unsigned long는 4294967296까지 넣을수 있는데 이걸 직접 써야 할까요?


그렇게 해도 되고 좀더 쉬운 방법으로 0xFFFFFFFF라고 써도 되겠지만


더 쉬운 방법은 ~0이라고 쓰는 것 입니다.


0은 모든 비트가 0인데 이걸 1의 보수 연산자로


~0이라고 쓰면 모든 비트가 1이 되므로 가장 큰값이 되는 것이죠.


(5) 쉬프트


다음으로 쉬프트 연산자인 <<와 >>에 대해 알아보죠


<<,>>는 지정된 방향으로 지정되 수 만큼 비트를 이동시키는 것 입니다.


예를 들어


?? = 0xF0 >> 4;


이렇게 하면 0xF0 즉 11110000을 >>방향으로 4만큼 이동시키는 것이죠


그래서 결과는 00001111 즉 0x0F가 됨니다.


만약 1이 오른쪽 끝까지 갔다면 그냥 없어집니다.


그리고 왼쪽은 0으로 계속 채워지구요.


<<도 이것과 똑같으나 방향만 다를 뿐 입니다.


이것으로 비트별 연산자는 마치도록 하죠.


기타 연산자.


다음으로 기타 연산자들을 배워 보기로 하겠습니다.


여기서 배울 것에는 조건 연산자, 증감 연산자, 그리고 sizeof연산자와,


혼합 연산자가 있습니다.


(1) 조건 연산자


조건 연산자는 주어진 조건에 따라 어떤 수식을 실행하고


그 결과를 돌려주는 연산자 입니다.


사용법은


조건 ? 수식1 : 수식2


이런 식으로 사용하죠.


여기서 조건은 관계형 연산자로 만든 조건입니다.


여기서 만약 조건이 참이면 수식1을 실행한 후 그 결과를 돌려주고,


거짓이면 수식2를 실행하는 것 입니다.


예를 들어 보죠.


a = 1>3 ? 1+3 : 2+6;


여기서 a에 들어가는 값은?


1>3이란 조건은 거짓이므로 두번째 수식인 2+6이 실행되고


결과로 8을 돌려주므로 a는 8이 되겠죠.


이 문장은


1>3 ? a=1+3 : a=2+6;


이렇게 써도 상관 없습니다. =이 들어가도 수식이므로


(2) 증감 연산자


이번엔 증감 연산자에 대해 알아보죠.


증감 연산자는 어떠 변수에 1을 더하거나 빼 주는 연산자이죠


연산자에는

---------------------
  ++   1을 증가시킴
  --   1을 감소시킴
---------------------



이렇게 두 가지가 있습니다.


이 두 연산자는 변수 앞이나 뒤에 붙여 사용하면 되는데


앞에 붙일때와 뒤에 붙일때의 차이점은 일단 나중으로 넘기고


예를 들어보죠.


만약


a++;


이렇게 하면 a는 1이 증가하게 됨니다.


즉 a=a+1;가 되는 것이죠.


그리고


a--;


이렇게 하면 a=a-1;이 되는 것 이고요.


그럼 앞에 붙이느냐 뒤에 붙이느냐에 차이를 알아보죠.


이 차이가 나는 곳은 바로 이 연산자가 하나로만 쓰이지 않고


여러개의 연산자와 같이 쓰였을때 차이가 남니다.


이 연산자를 앞에 붙이면


이 연산이 가장 먼저 수행되고 다른 연산이 수행됨니다.


하지만 이 연산자를 뒤에 붙이면 다른 모든 연산을 수행하고


이 연산을 수행하게 되죠.


예를 들어

int a,b=1;
a = 6 - ++b;



이렇게 했을때는 앞에 붙었으므로


우선 b를 1 증가시켜 2로 만든 후 6에서 빼 a에는 4가 들어가지만

int a,b=1;
a = 6 - b++;



이럴경우 우선 다른 연산부터 해서 a에는 5가 들어가고


마지막으로 b가 1이 증가되어 2가 되게 됨니다.


(3) sizeof연산자


이번엔 sizeof연산자에 대해 알아보죠.


sizeof는 어떤 데이터 타입이나 변수, 또는 상수의 크기를


바이트 단위로 알아내는 연산자 입니다.


사용법은

sizeof(데이터타입) 또는
sizeof(데이터)



예를 들어


a=sizeof(char)


이렇게 할 경우 char형태는 1바이트 이므로


a는 1이 됨니다.


그리고

char c;
a=sizeof(c);



이렇게 해도 1이 되죠


a=sizeof(long);


이렇게 하면 4를 돌려 주겠죠?


그리고 만약 배열이라면 배열 크기를 바이트 수로 돌려줌니다.


예를 들어

int array[10];
a=sizeof(array);



이렇게 할 경우


int는 2바이트 이고 10개의 배열이므로


2*10=20이므로 20을 돌려줌니다.


(4) 혼합 연산자.


혼합 연산자는 말 그대로 두개의 연산자를 혼합한 것 입니다.


프로그램을 만들다 보면

a=a+3;
a=a-2;
a=a*3;
a=a/2;
a=a|0x0F;
a=a&0x0A;
a=a>>4;



이런 수식처럼 한개의 데이터 여기선 a가 겹치는 수식을 쓸 때가 있습니다.


이럴때 더 간단히 쓸 수가 있습니다.


바로 혼합 연산자를 쓰면 되는데 혼합 연산자의 종류에는


+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=


이런 것들이 있습니다.


각각의 기능을 살펴보면

------------------------------
a += b    ->     a = a + b
a -= b    ->     a = a - b
a *= b    ->     a = a * b
a /= b    ->     a = a / b
a %= b    ->     a = a % b
a &= b    ->     a = a & b
a |= b    ->     a = a | b
a ^= b    ->     a = a ^ b
a <<= b   ->     a = a << b
a >>= b   ->     a = a >> b
------------------------------



이런 기능을 합니다.


이렇게 혼합 연산자를 잘 쓰면 수식을 더 간단히 쓸수 있죠

?

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
164 언어/기타 이론강의 4. 시나리오 작성 - 설정 Vermond 2007.01.26 482
163 언어/기타 [강의링크] 대비법칙-색상대비-밀당의 재미 약한 반대색 설계 천무 2015.04.02 481
162 언어/기타 세트아이탬 이미지표시. 린쌍 2006.05.05 480
161 RPG Maker 자질구레팁1] 0.75배속/1.5배속/3배속으로 이벤트를 움직이게 해보자. 파파 곤잘레스 2006.04.18 479
160 언어/기타 게임을 상상형식으로 만들자. 히어로RPG 2006.03.31 479
159 언어/기타 1. DirectX 8.0 sdk 해보기. file 케이코냥이 2006.08.26 478
158 언어/기타 조건분기:***번호의 스위치가 ON CC(虎) 2006.01.07 477
157 언어/기타 댓글을 다시는 분이 3분 더 생겼다. 아란 2006.08.08 477
156 언어/기타 초보가..]겜블주머니 만들기 잃어버린98 2005.10.26 476
155 RPG Maker [RMXP] 벽 소환 이벤트를 만들자 file 연필군 2007.01.06 476
154 언어/기타 아이디어라기보다는 팁 Ress 2006.02.28 474
153 언어/기타 플레이어의 질서 의식 고취! EverSmileMan 2006.05.18 473
152 언어/기타 [Orchestral Instrumentation] 1. 오케스트라 개론 PianoForte 2005.10.06 472
151 언어/기타 맵 트리 데이타가 깨졌을 때 복구하기!!! 다크세이버™ 2006.05.30 472
150 언어/기타 무자게 허접한 아이디어 지옥의마검사 2005.11.13 471
» 언어/기타 비트 연산자 dnajs 2006.10.05 471
148 RPG Maker RPG2003의맵만들기에서 제일 중요한 기능 혼돈의하늘32 2005.07.21 468
147 언어/기타 스위치마스터 下편 『덩키동크』 2006.07.27 467
146 언어/기타 사운드 용량을 줄여보자! file 다크아머 2006.01.05 466
145 언어/기타 자료구조 (3) - 링크리스트 성령의분노 2006.03.24 465
Board Pagination Prev 1 ... 38 39 40 41 42 43 44 45 46 47 ... 51 Next
/ 51






[개인정보취급방침] | [이용약관] | [제휴문의] | [후원창구] | [인디사이드연혁]

Copyright © 1999 - 2016 INdiSide.com/(주)씨엘쓰리디 All Rights Reserved.
인디사이드 운영자 : 천무(이지선) | kernys(김원배) | 사신지(김병국)