비트 연산자 : 비트 단위로 연산이 이루어지는 연산자
비트단위 연산을 하는 경우
- '암호화' 작업처럼 임의의 숫자를 만들 때
- 어떤 변수의 특정 비트를 꺼내보는 경우(마스킹 : masking)
- 하드웨어에 내장되는 임베디드 시스템 프로그램에서 메모리 용량이 부족하거나 계산이 복잡해 속도가 느려질 때
비트 논리 연산자
■ & 연산자 ■
&(AND) 연산자는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과 값이 1이 된다.
int num1 = 5; int num2 = 10; int result = num1 & num2; |
→ | num1 : 0 0 0 0 0 1 0 1 & num2 : 0 0 0 0 1 0 1 0 ---------------------------- result : 0 0 0 0 0 0 0 0 |
5와 10을 & 연산하면 결과 값은 0이 된다.
■ | 연산자 ■
|(OR) 연산자는 비트 값이 하나라도 1이면 연산 결과 값이 1이 된다.
int num1 = 5; int num2 = 10; int result = num1 | num2; |
→ | num1 : 0 0 0 0 0 1 0 1 | num2 : 0 0 0 0 1 0 1 0 ---------------------------- result : 0 0 0 0 1 1 1 1 |
5와 10을 | 연산하면 결과는 2진수로 00001111이다. 이 값을 10진수로 변환하면 15가 나온다.
■ ^ 연산자 ■
^(XOR) 연산자는 같은 값이면 0, 다른 값이면 1의 결과 값을 갖는다.
int num1 = 5; int num2 = 10; int result = num1 ^ num2; |
→ | num1 : 0 0 0 0 0 1 0 1 ^ num2 : 0 0 0 0 1 0 1 0 ---------------------------- result : 0 0 0 0 1 1 1 1 |
■ ~ 연산자 ■
~(반전) 연산자는 비트 값을 0은 1로, 1은 0으로 바꾸는 연산자이다. 그래서 반전 연산자라고도 한다.
int num = 10; int result = ~num; |
→ | num : 0 0 0 0 1 0 1 0 ---------------------------- ~ num : 1 1 1 1 0 1 0 1 |
위의 경우는 부호 비트가 1로 바뀌었기 때문에 음수이다.
2진수 11110101을 10진수로 변환하면 11이 되어, ~num 값은 -11이다.
비트 이동 연산자
시프트(shift) 연산자라고도 한다.
■ << 연산자 ■
<< 시프트 연산자는 왼쪽으로 비트를 이동하는 연산자이다.
int num = 5; num << 2; |
→ | num : 0 0 0 0 0 1 0 1 num << 2 : 0 0 0 1 0 1 0 0 |
00000101을 두 비트만큼 왼쪽으로 이동, 이때 앞 두 자리 비트 00은 없어지고 뒷부분은 0으로 채워진다.
왼쪽으로 n비트 이동한다는 것은 기존 값에 2ⁿ만큼 곱한다는 뜻
왼쪽으로 2비트 이동한 00000101은 5 * 2² = 20, 즉 값 20이 된다.
■ >> 연산자 ■
>> 시프트 연산자는 오른쪽으로 비트를 이동하는 연산자이다.
int num = 10; num >> 2; |
→ | num : 0 0 0 0 1 0 1 0 num >> 2 : 0 0 0 0 0 0 1 0 |
오른쪽으로 n비트 이동하면 기존 값을 2ⁿ만큼 나눈다.
위의 경우 10 / 2² 이 되므로 결과 값은 2가 된다.
왼쪽에 채워지는 비트 값은 기존 값의 부호 비트와 동일하다.
■ >>> 연산자 ■
>>> 시프트 연산자는 >> 연산과 동일하게 비트를 오른쪽으로 이동한다.
차이가 있다면 >>> 연산자는 왼쪽에 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 된다.
[실습] 비트 이동 연산자를 사용하여 연산하기
package operator;
public class OperationEx5 {
public static void main(String[] args) {
int num = 0B00000101; //5를 8비트 2진수로 나타냄
System.out.println(num << 2); //왼쪽으로 2비트 이동 00010100 (20)
System.out.println(num >> 2); //오른쪽으로 2비트 이동 00000001 (1)
System.out.println(num >>> 2); //오른쪽으로 2비트 이동 00000001 (1)
System.out.println(num); //num에 값을 대입하지 않아 비트 이동과 관계없이 기존 값 출력
num = num << 2; //왼쪽으로 2비트 이동한 값을 다시 num에 대입
System.out.println(num);
}
}
위의 실습내용에서 중요한 것은 비트를 이동했다 해서 num값이 바로 바뀌는 게 아니다는 것
왜냐하면 num값을 참조해서 이동했을 뿐, 이동한 값을 대입하지 않았기 때문
연산자 우선순위
● 단항 연산자가 가장 높고 이항, 삼항 연산자 순서이다
● 대입 연산자의 우선순위가 가장 낮다
● 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가지며, ()의 우선순위가 가장 높다
우선순위 | 형 | 연산자 | 연산방향 |
1 | 일차식 | () [] . | → |
2 | 단항 | ! ++ -- + - | ← |
3 | 산술 | % / | → |
4 | 산술 | + - | → |
5 | 비트이동 | << >> | → |
6 | 관계 | < > <= >= | → |
7 | 관계 | == != | → |
8 | 비트 곱 | & | → |
9 | 비트 차 | ^ | → |
10 | 비트 합 | | | → |
11 | 논리 곱 | && | → |
12 | 논리 합 | || | → |
13 | 조건 | ? : | → |
14 | 대입 | = += -= *= %= /= | ← |
https://github.com/hyunjin1292/Java_study
※ 이지스퍼블리싱의 'Do it! 자바 프로그래밍 입문' 책을 보고 공부한 내용을 정리하고 있습니다.
'Language > Java' 카테고리의 다른 글
[Java] 반복문 (0) | 2022.09.20 |
---|---|
[Java] 조건문 (0) | 2022.08.12 |
[Java] 기본 연산자 (0) | 2022.08.08 |
[Java] 형 변환 (0) | 2022.07.22 |
[Java] 상수와 리터럴 (0) | 2022.07.20 |