C++ 비트 연산자 (&, |, ^, ~)

2023. 11. 4. 14:16·C++

C++의 비트 연산자 중 &, |, ^, ~가 의미하는 것이 무엇인지 알아보겠다.

 

먼저 &은 곱하기 라고 생각하면 편할 것이다, 전자 회로쪽을 공부한 사람이라면 알고 있을 AND게이트의 역할과 동일하다고 보면 된다. 요약하자면 &은 둘다 1일 경우에만 1을 값을 반환한다고 보면 된다.

 

AND 연산

1010과 1001을 &으로 계산하게되면 1000이라는 결과 값이 나오게 되는데 이는 &이 둘다 1일 경우에만 1을 반환하는 연산을 하기 때문이다.

 

디버깅 결과 값 역시 2진수 1000, 즉 10진수 8이라는 결과값이 나오게 되었다.

 

 

그렇다면 비트연산자 |는 어떠한 연산을 할까?

|는 OR연산, 즉 덧셈을 한다고 생각하면 이해가 빠를것이다. 요약하자면 |는 둘중 하나라도 1이 있으면 1, 나머지는 0을 

반환한다. 1010 과 1001을 |연산 할경우 1011이 될것이다.

 

디버깅 결과를 통해 11이 나오는것을 확인할 수 있다. 이처럼 | 비트 연산자는 둘중 하나라도 1이라면 1을 반환한다는 것을 알수있다.

 

 

 

그렇다면 비트연산자 ^는 어떠한 연산을 할까? ^는 XOR로 같으면 0 다르면 1을 반환하게 된다.

 앞선 예시로 사용한 2진수 1010과 1001을 ^연산을 하면 결과값은 0011이 되는것이다. 

 

XOR 연산

위 그림처럼 같은 자리의 수가 같다면 0, 다르면 1이 반환되는것이다.

 

 

디버깅 결과 역시 3이 결과 값으로 나온것을 확인할 수 있다.

 

 

 

그렇다면 비트연산자 ~은 어떤 연산을 하는것 일까? ~은 NOT으로 0을 1로,1을 0으로 반전 시켜주는 연산을 한다.

예를 들어 1010 을 ~연산을 하게되면 결과 값이 0101이 되는것일까?

 

디버깅 결과 값은 -11이 나오게 되었다. 1010 을 반전시키면 0101로 5라는 값이 나올줄 알았는데 왜 -11이 나온것일까?

이를 이해하기 위해서는 컴퓨터에서 데이터의 표현 방식과 음수를 표현하는 방식을 알고있어야한다.

 

char num1의 데이터 구조

자료형 char은 1byte 데이터 타입으로 8bit의 크기를 갖는다.

char 변수 num1 = 1010은 실제 데이터 구조상 00001010 으로 데이터가 저장되어 있는 상태이다.

이를 반전시키면 11110101이 되는것이다. 

8bit 데이터 공간에서 맨 앞에 있는 비트를 우리는 msb 또는 부호 비트라고 부른다

부호비트는 1이면 음수, 0이면 양수가 되는것이다. 즉 00001010을 반전시킨 1110101은 음수인것이다.

그리고 부호비트를 제외한 1110101이 숫자 영역이되는것이다.

 

숫자영역 1110101은 음수 표현방식으로 되어있다. 컴퓨터는 음수의 데이터 표시방식이 양수 표현방식과 다른데,

더해서 0을 만들어주는 비트가 즉 그 수의 음수가 되는 구조이다. 00001010 과 더해서 모든 자리수를 0으로 만들어 주는 그 숫자가 즉 그 수의 음수가 되는것이다.

 

풀어서 설명하자면 00001010은 10진수로 얘기하면 9, -9는  00001010과 더해서 모든자리의 비트를 0으로 만들어주는

비트인 1110110이 되는것이다. 2의 보수 법을 통해 쉽게 구할수 있다. 2의 보수법은 모든 수를 반전시킨후 그 값의 1만 더해주면 된다.

 

즉 00001010 을 ~로 반전 시키면 11110101이고 이 수를 양수로 치환하기 위해 부호 비트를 제외한 비트의 자리수를

2의 보수법을 통해 연산하면 (1)0001011 = -11, 앞선 결과값 -11이 나옴을 알수 있다.

이처럼 ~는 모든 자리의 비트 수를 반전 시키는 연산을 한다는 것을 알수 있다.

 

 

정리하자면,

&은 1을 0으로, 0을 1로,

|는 하나라도 1이면 1, 나머지는 0,

^는 같으면 0, 다르면 1,

~는 0을 1로, 1을 0으로 연산한다.

 

 

 

 

'C++' 카테고리의 다른 글

C++ 함수 호출(메모리 영역)  (0) 2023.11.05
C++ 게임에서의 비트 연산 활용  (1) 2023.11.04
C++ 비트 연산(시프트 연산)  (0) 2023.11.04
C++ 실수 표현 방식  (0) 2023.11.03
C++ 정수 자료형  (0) 2023.11.02
'C++' 카테고리의 다른 글
  • C++ 함수 호출(메모리 영역)
  • C++ 게임에서의 비트 연산 활용
  • C++ 비트 연산(시프트 연산)
  • C++ 실수 표현 방식
하길
하길
게임 개발을 위한 나의 모든 지식의 총 집합체
  • 하길
    Until Dawn
    하길
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (141)
      • Unreal Engine 5 (0)
      • Unity (29)
        • 3D (5)
        • 2D (7)
      • C++ (13)
      • C# (11)
      • 알고리즘 (35)
      • TIL (22)
      • 기타 (1)
      • 대장간 (12)
      • 메모 (2)
      • 게임리뷰 (0)
      • 일상 (0)
        • 챌린지 (0)
      • Article (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
하길
C++ 비트 연산자 (&, |, ^, ~)
상단으로

티스토리툴바