비트 연산자
비트 연산자는 말 그대로 비트 단위로 연산이 이루어지는 연산자이다.
'암호화' 작업처럼 임의의 숫자를 만든다거나, 메모리 용량이 부족할 때, 계산이 복잡해서 속도가 느려질 때 비트 연산자를 이용해서 빠른 속도로 계산을 할 수 있다. 데이터는 컴퓨터 내부에서 0과 1로 이루어져 있기 때문에, 0 또는 1로 표현할 수 있는 최소단위인 비트로 계산할 때 속도가 빠른 것이라고 이해할 수 있다.
비트 (bit) : 0 또는 1로 표현할 수 있는 최소 단위, 8비트가 모이면 1 바이트(Byte)가 된다.
비트 논리 연산자 & | ^ ~
& (AND) 연산자
두 개의 비트값이 모두 1인 경우에만 연산 결과 값이 1이 된다.
int num1 = 5;
int num2 = 10;
int result = num1 & num2;
num1 = 00000101
& num2 = 00001010
------------------------
result = 00000000
5 & 10 의 결과값은 0이다.
| (OR) 연산자
비트 값 하나라도 1이면 연산 결과 값이 1이 된다.
int num1 = 5;
int num2 = 10;
int result = num1 | num2;
num1 = 00000101
| num2 = 00001010
------------------------
result = 00001111
5 | 10 의 결과값은 15이다.
^ (XOR) 연산자
비트 값이 다르면 1, 같으면 0의 연산 결과 값을 가진다.
int num1 = 5;
int num2 = 10;
int result = num1 ^ num2;
num1 = 00000101
^ num2 = 00001010
------------------------
result = 00001111
5 ^ 10 의 결과값은 15이다.
~ (반전) 연산자
비트 값을 0은 1로, 1은 0으로 바꾸는 연산자
int num = 5;
int result = ~num;
num = 00000101
~num = 11111010
위 경우는 부호비트가 1로 바뀌었기 때문에 음수 값으로 변경된다.
음수 값은 양수로 다시 변환해야 값을 알 수 있는데, 2진수 11111010을 10진수로 변환하면 6이 되고, 따라서 ~num1의 값은 -6이다.
비트 이동 연산자 <<, >>, >>> shift 연산자
<< 연산자
<< 시프트 연산자는 왼쪽으로 비트를 이동하는 연산자
int num = 5;
int shift = num << 2;
num = 00000101
num << 2 = 00010100
00000101 을 두 비트만큼 왼쪽으로 이동하라는 뜻
이 때, 앞 두자리 00은 없어지고 뒷부분이 0으로 채워진다.
따라서, 왼쪽으로 n 비트 이동한다는 것은 기존 값에 2ⁿ 만큼 곱한다는 뜻이다.
왼쪽으로 2비트 이동한 5는 00010100이 되어 5*2² = 20 이 된다.
>> 연산자
>> 시프트 연산자는 오른쪽으로 비트를 이동하는 연산자
int num = 5;
int shift = num >> 2;
num = 00000101
num >> 2 = 00000001
00000101 을 두 비트만큼 오른쪽으로 이동하라는 뜻
오른쪽으로 n 비트 이동한다는 것은 기존 값에 2ⁿ 만큼 나눈다는 뜻이다.
따라서 오른쪽으로 2비트 이동한 5는 00000001이 되어 5/2² = 1 이 된다.
>>> 연산자
>>> 시프트 연산자는 >> 연산자와 동일하게 비트를 오른쪽이로 이동하는 연산자
차이점은 >>> 연산자는 왼쪽에 채워지는 비트값이 부호 비트와 상관없이 무조건 0이 된다.
'JAVA' 카테고리의 다른 글
How to Convert CamelCase to UnderScore & UnderScore to CamelCase (1) | 2023.01.14 |
---|---|
[JAVA] 스택 / 큐 (0) | 2021.04.06 |