개발 공부/Java

[Java] - 비트 연산자

징_ 2023. 10. 30. 02:18

* 비트 연산자란?

: 비트 단위에서 연산이 이루어 지는 연산자이며 정수에만 사용할 수 있는 연산자이다.

 

 

 

* 비트 논리 연산자

  • &(AND) 연산자

: 두 비트가 모두 1인 경우 - 결과 1 / 그 외 - 결과 0

int num1 = 5;
int num2 = 10;
int result = num1 & num2; 

// 비트
 num1  : 00000101
&num2  : 00001010
------------------
result : 00000000
  • | (OR) 연산자

: 두 비트가 모두 0인 경우 - 결과 0 / 그 외 - 결과 1(하나의 비트라도 1이라면)

int num1 = 5;
int num2 = 10;
int result = num1 | num2; 

// 비트
 num1  : 00000101
|num2  : 00001010
------------------
result : 00001111
  • ^(XOR) 연산자

: 두 비트가 다른 값이면 - 결과 1 / 같은 값이면 - 결과 0

int num1 = 5;
int num2 = 10;
int result = num1 ^ num2; 

// 비트
 num1  : 00000101
^num2  : 00001010
------------------
result : 00001111
  • ~(반전) 연산자

: 비트 값을 0 → 1, 1 → 0으로 바꿈

int num = 10;
int result = ~num; 

// 비트
 num  : 00000101
------------------
~num  : 11110101

 

 

 

* 비트 이동 연산자

: 시프트(shift) 연산자라고도 부르며 <<, >>, >>> 세 가지가 존재

 

  • << 연산자 (왼쪽 shift) 

: 비트를 왼쪽으로 이동 / 왼쪽으로 n비트를 이동하는 것기존 값에 2ⁿ만큼 곱한다는 의미

빈자리는 0으로 채움

int num = 5;
num << 2;

// 비트
num      : 00000101
num << 2 : 00010100

=> 00000101 두 비트 왼쪽 이동  /  5 * 2² = 20

 

  • >> 연산자 (오른쪽 shift) 

: 비트를 오른쪽으로 이동 / 오른쪽으로 n비트를 이동하는 것 기존 값에 2ⁿ만큼 나눈다는 의미

빈자리는 정수의 최상위 부호와 같은 값으로 채움

int num = 5;
num >> 2;

// 비트
num      : 00000101
num >> 2 : 00000010

=> 00000101 두 비트 오른쪽 이동 / 10/ 2² = 2(소수점 뒤 생략)

 

  • >>> 연산자 (오른쪽 shift)

: 비트를 오른쪽으로 이동, 빈자리(왼쪽)을 무조건 부호비트가 아닌 0으로 채움

int num = 5;
num >> 2;

// 비트
num      : 00000101
num >> 2 : 00000010

 

 

* 비트 연산자 활용

  • 마스크 : 특정 비트들은 가리고 몇 개의 비트들의 값만 사용할 때
  • 비트 켜기 : 특정 비트들만을 1로 설정해서 사용하고 싶을 때

       ex) & 00001111 (하위 4비트 중 1인 비트만 꺼내기)

  • 비트 끄기 : 특정 비트들만을 0으로 설정해서 사용하고 싶을 때

       ex) | 11110000 (하위 4비트 중 0인 비트만 0으로 만들기)

  • 비트 토글 : 모든 비트들을 0은 1로, 1은 0으로 바꾸고 싶을 때

 

 

 

* 연산자 우선순위

  • 단항 연산자 > 이항 연산자 > 삼항 연산자
  • 대입 연산자 우선순위가 가장 낮음
  • 산술 > 관계 > 논리 > 대입 연산자 순으로 우선순위
  • ()의 우선순위가 가장 높음