[그린컴퓨터] Server/JAVA(기본)

비트 연산자 {정의, 논리, 이동}

Ben의 프로그램 2023. 5. 11. 12:32
728x90

이전까지 배운 연산이 변수나 상수에 대한 연산이라면, 이번에는 비트 값을 기반으로 하는 연산자를 배워보겠습니다.

비트 연산자란?

  • 비트 연산자는 비트 단위로 연산이 이루어지는 연산자를 의미합니다.
  • 비트 단위의 연산을 하는 경우는 '암호화' 작업처럼 임의의 숫자를 만들거나, 어떤 변수의 특정 비트를 꺼내보는 (마스킹 masking) 경우에 사용합니다. 혹은 하드웨어에 내장되는 임베디드 시스템 프로그램에서 메모리 용량이 부족하거나 계산이 복잡해서 속도가 느려질 때, 곱셈이나 나눗셈을 비트 이동 연산자를 사용하면 어떤 수의 2배수, 4배수를 만들어 속도를 빠르게 할 수 있습니다.
  • 자바에서는 특정 값을 만들거나 연산할 때 비트 연산자를 사용합니다.

비트 논리 연산자

  • 비트 단위로 &, |, ^, ~ 연산이 있습니다.
  • & 연산자 (AND 연산자)
& 연산자 (AND) 는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과 값이 1이 됩니다.
예를 들어, 5와 10을 2진수로 표현하면 
5   : 0 0 0 0 0 1 0 1
10 : 0 0 0 0 1 0 1 0
입니다. 

int result = 5 & 10; 
의 결과 값은 0 0 0 0 0 0 0 0 (2진수) 이므로 0 (10진수)가 됩니다.
  • | 연산자 (OR 연산자)
| 연산자 (OR) 연산자는 비트 값이 하나라도 1이면 연산 결과 값이 1이 됩니다. 
예를 들어, 5와 10을 2 진수로 표현하면
5   : 0 0 0 0 0 1 0 1
10 : 0 0 0 0 1 0 1 0
입니다. 

int result = 5 | 10; 
의 결과 값은 0 0 0 0 1 1 1 1(2진수) 이므로 15 (10진수)가 됩니다.
  • ^ 연산자 (XOR 연산자)
^ 연산자 (XOR) 연산자는 같은 값이면 0, 다른 값이면 1의 결과 값이 됩니다.
예를 들어, 5와 10을 2 진수로 표현하면
5   : 0 0 0 0 0 1 0 1
10 : 0 0 0 0 1 0 1 0
입니다. 

int result = 5 ^ 10; 
의 결과 값은 0 0 0 0 1 1 1 1(2진수) 이므로 15 (10진수)가 됩니다.
  • ~ 연산자 (NOT 연산자)
~ 연산자 (NOT) 연산자는 비트 0 은 1로 비트 1은 0으로 바꾸는 연산자입니다. 반전 연산자라고도 합니다.
예를 들어, 5와 10을 2 진수로 표현하면
5   : 0 0 0 0 0 1 0 1
10 : 0 0 0 0 1 0 1 0
입니다. 

int result = ~5; 
의 결과 값은 1 1 1 1 1 0 1 0 이 됩니다. 

비트 이동 연산자

  • 비트 이동 연산자는 <<, >>, >>> 이렇게 세 가지가 있습니다. 이를 시프트(shift) 연산자라고도 부릅니다. 세 연산자의 기능을 자세히 살펴보겠습니다.
  • << 연산자
<< 연산자는 왼쪽으로 비트를 이동하는 연산자입니다. << 연산자로 어떤 수의 왼쪽으로 n 만큼 이동한다는 것은 어떤 수의 2의 n 승 만큼 곱한 수로 만든다는 것을 의미합니다. 5 << 2; 의 결과 값은 5 * 2의 2승 = 20입니다.
  • >> 연산자
>> 연산자는 오른쪽으로 비트를 이동하는 연산자입니다. >> 연산자로 어떤 수의 오른쪽으로 n 만큼 이동한다는 것은 어떤 수의 2의 n 승 만큼 나눈 수로 만든다는 것을 의미합니다. 12 >> 2; 의 결과 값은 12 / 2의 2승 = 3입니다.
  • >>> 연산자
>>> 시프트 연산자는 >> 연산과 동일하게 비트를 오른쪽으로 이동합니다. 차이점은 >>> 시프트 연산자는 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 됩니다.

예를 들어 2 진수의 5로 확인해보겠습니다.
0 0 0 0 0 1 0 1 : 2진수로 보는 10진수 5
0 0 0 0 0 0 0 1 : 5 >>> 2 의 결과값 = 1