티스토리 뷰
안녕하세요, IT디자이너입니다.
이번 포스팅은 C언어와 C++언어의 비트연산자의 사용방법과 활용용도에 관하여 설명드리도록 하겠습니다.
비트연산자란 우리가 사용하는 char, int, double과 같이 byte단위의 정수 또는 실수 연산이 아닌 말 그대로 bit 단위로
2진수형태로 접근하여 연산하는 연산자입니다.
우리가 주로 사용하는 데이터 타입인 char(1Byte)는 8개의 bit로 표현될 수 있으며, 만약 char 라는 데이터에 1을 대입하여 2진수로 출력하였을 때 000000001 이라는 값이 출력됩니다.
지금부터 8개의 bit를 기준으로 설명드리도록 하겠습니다.
1. & ( AND )
&연산자는 포인터를 배우셨다면 "주소 연산" 이라고 알고계실겁니다. 하지만 2항 연산자로서 사용할 경우 비트연산이으로 컴파일됩니다.
0000 0001 & 0000 0011 연산의 결과는 0000 0001 이 됩니다. 즉 대응되는 bit 값이 1로 동일하지 않으면 0이 출력되고 1로 동일하면 대응하는 bit의 연산 결과가 1로 출력됩니다.
CPU의 레지스터에 접근하거나 메모리에 접근하여 원하는 bit 값을 출력할 때 주로 사용합니다.
ex) edx == 0001 0011 에서 하위 4bit를 출력하고 싶을 때 edx & 0000 1111 연산으로 하위 4bit를 얻습니다.
2. | ( OR )
| 연산자는 대응하는 bit 가 하나라도 1일 경우에 1을 출력 결과를 얻을 수 있는 비트 연산자입니다.
즉, "0001 1111 | 1000 0000"의 출력 결과는 "1001 1111"의 출력 결과를 얻을 수 있습니다.
3. ^ ( XOR )
^ 연산자는 대응하는 bit가 동일한 값일 경우 0을 출력하고 동일하지 않으면은 1을 출력하는 비트 연산자입니다.
즉, "0011 1010 ^ 1110 1111" 의 결과값은 "1101 0101"의 값을 얻을 수 있습니다.
주로 암호화와 복호화에 사용되는 연산자이며, 특정 값을 0으로 초기화할 때도 유용하게 사용될 수 있습니다.
사례
- ex) a = 2; 일 경우 a ^ a 값은 0의 출력결과를 얻을 수 있습니다.
- 함수의 return 값이 0일 경우 레지스터를 xor연산하여 반환합니다.
- 윈도우 환경에서 마우스의 커서에 따라서 발생하는 색상이 바뀌는 이벤트는 거의 xor연산을 사용합니다.
4. ~ ( 비트 단위 NOT )
~ 연산자는 bit를 반전시키는 연산을 합니다.
1의 값을 ~ 연산시 "1111 1110"의 10진수 값인 254의 출력결과를 얻을 수 있습니다.
5. <<, >> (비트 이동)
비트 이동은 2항 연산자로 우항에 있는 값만큼 비트를 우측 또는 좌측으로 이동시키는 연산자입니다.
ex) "0110 1010 >> 1" 결과 값은 "0011 0101" 입니다.
ex ) "0110 1010 << 1" 결과 값은 "1101 0100" 입니다.
unsigned일 경우 bit 이동으로 부족한 bit 부분은 0으로 채워지게 되어있습니다.
하지만, signed이며 음수일 경우는 1로 채워지게 됩니다.
ex) "1010 0000 >> 1"의 결과 값은 "1101 1000"의 결과값을 얻을 수 있습니다.
이유는 맨 앞의 bit를 MSB 즉, 부호비트이며 부호비트가 1일 경우 음수 0일 경우 양수를 표현합니다.
signed 변수에서의 shift연산은 결과값을 예측하기가 어려워 거의 사용이 불가능합니다.
6. 비트연산자의 특징 및 추가 설명
비트 연산자는 연산자 우선순위에서 거의 낮은 우선순위를 갖습니다. 주로 코딩테스트에서 연산자 우선순위 관련하여 문제가 종종 출제된다고 합니다.
int a = 3*5 << 2*3 << 1; 이런 경우의 문제에서 <<연산자는 *연산자보다 낮은 우선순위를 가지고 있는데,
많은 사람들이 bit단위 연산자이니 우선순위가 높은 연산자로 착각하는 경우가 많습니다. !!!
우선순위표를 꼭 한번 확인해주시는게 좋을것 같습니다.
추가적으로 bit단위 연산자가 일반 연산자에 비해 상당히 빠른 결과를 얻을 수 있습니다.
과거에는 곱하기나 나누기 연산자 대신 << 또는 >> 연산자를 이용하여 표현하였다고 합니다. 하지만,
( 워낙 컴퓨터 성능이 좋아져서 요즘은 이렇게까지 연산자를 사용하는 경우는 극히 드뭅니다.!! ^_^ )
이상 비트연산자에 관하여 설명을 마치겠습니다.
감사합니다.!
'Language > C 언어' 카테고리의 다른 글
C언어 열거형의 정의와 의미 (0) | 2020.03.25 |
---|---|
C/C++ 함수의 호출 규약 (Calling Convention) with 어셈블리 (1) | 2020.03.24 |
C언어의 기억클래스, 속성 수식자 (0) | 2020.03.20 |
Debug 모드와 Release 모드 디버깅 ( 2 ) (0) | 2020.03.19 |
Debug 모드와 Release 모드 디버깅 (0) | 2020.03.18 |
- Total
- Today
- Yesterday
- C언어 #C++ #어셈블리어 #열거형 데이터타입 #IT디자이너
- C언어 #자료구조 #C++ #연결리스트 #리스트 #알고리즘 #IT디자이너
- C언어 #IT디자이너
- IT디자이너 #QuickSort #퀵정렬 #C언어 #C++ #자료구조 #알고리즘
- C언어 #C++ #파일 입출력 #텍스트파일 #IT디자이너
- 어셈블리어 #IT디자이너 #C언어 #C++언어 #어셈블리 #어셈블러
- C언어 #C++ #어셈블리어 #IT디자이너 #비트연산자 #연산자 #C언어의 비트 연산자
- C언어 #IT디자이너 #포인터 #배열 #포인터와 배열
- C언어 #C++ #어셈블리어 #재귀함수 #IT디자이너
- C언어 #C++ #삼각함수 #IT디자이너 #문제풀이 #2진수 #16진수 #비트 #bit #비트연산자
- IT디자이너 #C언어 #C++ #속성지정자 #기억클래스 #IT #const #static #register #volatile #extern #auto #s
- C언어 #스트림 #버퍼링 #표준 입출력 함수 #C++언어 #IT디자이너
- IT디자이너 #C언어 #C++ #IT디자이너 #코딩테스트
- C언어 #포인터 #IT디자이너
- QUEUE #큐 #자료구조 #원형 큐 #Circle Queue #IT디자이너 #큐 과제 #C언어 #C++언어
- C언어 #IT디자이너 #C++언어
- C언어 #C++ #IT디자이너 #C++ 함수
- C언어 #C++ #IT디자이너 #함수 #재귀 함수 #스택 #자료구조 #페인팅
- 스택 #자료구조 #Stack #IT디자이너 #알고리즘 #C언어 #스택 과제 #C++
- C언어 #C++ #switch #if #어셈블리어 #switch문 사용 이유 #IT디자이너
- 디버그 #Debug #Release #디버그와 릴리즈 차이 #C언어 #C++언어 #어셈블리어
- C언어 #C++ #자료구조 #알고리즘 #IT디자이너 #버블 정렬 #BubbleSort
- C언어 #C++ #시간 함수 #타이밍 맞추기 #timer interrupt #IT디자이너
- C언어 #포인터 #배열 포인터 #포인터 배열 #함수
- C언어 #C++ #어셈블리어 #구조체 #구조체 특징 #IT디자이너
- C언어 #C++ #IT디자이너
- C언어 #C++ #어셈블리어 #함수 호출 규약 #IT디자이너 #비쥬얼 스튜디오 #IT
- Debug #C언어 #C++ #비쥬얼스튜디오 #Release #IT
- C언어 #C++ #구조체 정렬 #pragma #IT디자이너
- C언어 #C++ #캐시hit #캐시라인 #캐시무효화
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |