이번 포스팅에서는 자바(Java)의 비트 연산자(operator)에 대하여 공부를 해보고자 한다.
비트 연산자
비트 연산자는 말 그대로 비트 단위로 연산이 이루어지는 연산자를 말한다.
비트 단위의 연산을 하는 경우 '암호화' 작업처럼 임의의 숫자를 만들거나, 어떤 변수의 특정 비트를 꺼내보는(마스킹; masking) 경우에 사용한다.
프로그램에서 특정 값을 만들거나 연산할 때 비트 연산자를 사용한다.
비트 논리 연산자
비트 단위로 &, |, ^, ~ 연산이 이루어진다.
& 연산자
&(AND) 연산자는 두 개의 비트 값이 모두 1인 경우에만 연산의 결과 값이 1이 된다.
다음은 5와 10을 & 연산하는 과정이다.
컴퓨터 내부에서는 5와 10이 비트 단위로 연산되기 때문에 오른쪽처럼 2진수 형태로 연산된다.
5와 10을 & 연산하면 결과 값은 0이 된다.
| 연산자
|(OR) 연산자는 비트 값이 하나라도 1이면 연산 결과 값이 1이 된다.
다음은 5와 10을 | 연산하는 과정이다.
위에서 보았듯이 5를 8비트의 2진수로 표현하면 00000101, 10은 00001010이다.
5와 10을 | 연산한 결과는 2진수로 00001111이다.
이 값을 10진수로 변환하면 15가 나온다.
^ 연산자
^(XOR) 연산자는 같은 값이면 0, 다른 값이면 1의 결과 값을 갖는다.
~ 연산자
~(반전) 연산자는 비트 값을 0은 1로, 1은 0으로 바꾸는 연산자다.
다음은 10진수 10을 반전해 보는 예시다.
0은 1이 되고 1은 0이 되므로 결과는 다음과 같다.
위 경우는 부호 비트라 1로 바뀌었기 때문에 음수가 되었다.
2진수 11110101을 10진수로 변환하면 11이 되고 ~num 값은 -11이다.
음수는 양수로 다시 변환해야 값을 알 수 있다.
비트 이동 연산자
비트 이동 연산자는 <<, >>, >>> 이렇게 세 가지가 있다.
이를 시프트(shift) 연산자라고도 부른다.
<< 연산자
<< 시프트 연산자는 왼쪽으로 비트를 이동하는 연산자이다.
00000101을 두 비트만큼 왼쪽으로 이동했다.
이때 앞 두 자리 비트 00은 없어지고 뒷부분은 0으로 채워진다.
왼쪽으로 n비트 이동한다는 것은 기존 값에 2^n 만큼 곱한다는 뜻이다.
>> 연산자
>> 시프트 연산자는 오른쪽으로 비트를 이동하는 연산자이다.
오른쪽으로 n비트 이동하면 기존 값을 2^n 만큼 나눈다.
위 경우 왼쪽에 채워지는 비트 값은 기존 값의 부호 비트와 동일하다.
>>> 연산자
>>> 시프트 연산자는 >> 연산과 동일하게 비트를 오른쪽으로 이동한다.
차이가 있다면 >> 연산자는 왼쪽에 채워지는 비트 값이 부호 비트와 상관없이 무조건 0이 된다.
예시
비트 이동 연산자를 사용하여 연산하기
public class OperationEx {
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)
}
}
출력 결과
20
1
1
5
20
이 예시에서 주의할 점은 비트를 이동했다고 해서 num 값이 바로 변하지 않는다는 것이다.
num 값을 참조해서 이동했을 뿐 이동한 값을 num에 대입하지는 않았기 때문이다.
연산자 우선순위
연산자에는 우선순위가 있다.
우선순위에 따라 컴퓨터가 연산을 수행하고 그 결과가 달라지기 때문에 우선순위를 이해해야 한다.
연산자의 일반적인 우선순위는 다음과 같다.
- 단항 연산자가 가장 높고 이항, 삼항 연산자 순서이다.
- 대입 연산자의 우선순위가 가장 낮다.
- 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가진다.
'Back-End > Java' 카테고리의 다른 글
[Java] 반복문 (0) | 2023.01.29 |
---|---|
[Java] 조건문 (0) | 2023.01.29 |
[Java] 기본 연산자 (0) | 2023.01.28 |
[Java] 형 변환 (3) | 2023.01.27 |
[Java] 상수와 리터럴 (2) | 2023.01.27 |