개발 공부/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으로 바꾸고 싶을 때
* 연산자 우선순위
- 단항 연산자 > 이항 연산자 > 삼항 연산자
- 대입 연산자 우선순위가 가장 낮음
- 산술 > 관계 > 논리 > 대입 연산자 순으로 우선순위
- ()의 우선순위가 가장 높음