안선생의 개발 블로그
C++ 4. define/ 비트 연산자 본문
1. 쉬프트 연산자
종류 : << , >>
기능 : 비트를 화살표가 가리키는 방향으로 민다.
예)

byte의 변숫값은

이렇게 된다.
여기서

이렇게 하면
왼쪽으로 한 칸 가면

이렇게 된다.
왼쪽으로 한번 옮기니 2배가 됐다.
그래서 대입 연산자와 합쳐서 표현하면

이렇게 해주면 byte 안에 있는 값이 두 배 돼서 다시 받는 것이다.

이것을 축약한 것
만약

를 하면 원래 들어있던 값의 4배가 된다. (2²)

3칸 밀면 8배가 된다. (2³)
결론은

일 때 byte의 숫자가 2n 곱한 수이다.
반대로

오른쪽으로 옮기면 나누기 2이다.
결과 적으로

일 때 byte의 숫자가 2² 곱한 수이다.

일 때 byte의 숫자가 2n 나눈 몫이다.
2. 비트 연산자
종류 : 비트 곱 (&) , 합 (|) , xor (^) , 반전 (~)
뜻 : 논리 연산은 두 변수의 전체 결괏값을 확인하고 반환한 것이지만
비트 단위 연산자는 비트 단위로 비트끼리 하나씩 하나씩 연산하는 것이다.
기능 :
비트 곱 (&) : 둘 다 1인 경우 1
비트 합 (|) : 둘 중 하나라도 1 이면 1
반전 (~) : , 1은 0으로, 0은 1로
xor (^) : 같으면 0, 다르면 1
예)
상태를 나타낼 떄 자주 사용
#include<iostream>
#define a 0x01 // 1
#define HUNGRY 0x02 // 2
using namespace std;
int main()
{
int c = 0;
c |= HUNGRY; // HUNGRY의 상태를 c에다가 넣음 하나라도 넣으면 1이기 때문에 0000 0010이 나옴
if (c & HUNGRY) // 상태를 확인 하는 방법 c에는 0000 0010 이 있고 HUNGRY도 똑같기 때문에 참이 나와 배고픔이 출력됨
{
cout << "배고픔";
}
return 0;
}
특정 자리 비트 제거법
c &= ~HUNGRY;

뺸다고 해보자 2를 먼저 ~(반전) 시키면

이렇게 나올것이다.
여기서 &(곱)을 해주면 둘다 1이여만 1의 값이 나오므로

뺀 값이 나오게 된다.
결론은 비트를 특정부의를 빼고 싶을때 뺄 수를 ~(반전)시키고 두 수를 &(곱)해주면 된다.
ex) c &= ~HUNGRY;
일 때 a 는 1 이 된다.
여기서
이렇게 하면 b에 1이 들어간다.
이 위쪽에서 define이라는 전처리기로 정의를 해놓은 거다.
이유 :
컴파일러는 define 구문 전처리기이니 먼저 실행해야 한다.
define 구문의 HUNGRY라는 코드를 숫자 1로 바꿔라는 뜻이다.
결과적으로 b에 1을 넣은 것이다.
define의 장점
1) 가독성
2) 변경하기가 쉬움(유지 보수).
'C++' 카테고리의 다른 글
C++ 함수 (0) | 2022.05.27 |
---|---|
C++ 5. 변수 (0) | 2022.05.26 |
C++ 3. 조건문(if,switch),삼항 연산자 (0) | 2022.05.24 |
C++ 2. 연산자 (0) | 2022.05.23 |
C++ 1. 자료형 (0) | 2022.05.21 |