JAVA

[JAVA] 비트 연산자 정리

728x90

비트 연산자

비트 연산자는 말 그대로 비트 단위로 연산이 이루어지는 연산자이다.

'암호화' 작업처럼 임의의 숫자를 만든다거나, 메모리 용량이 부족할 때, 계산이 복잡해서 속도가 느려질 때 비트 연산자를 이용해서 빠른 속도로 계산을 할 수 있다. 데이터는 컴퓨터 내부에서 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이 된다.

 

 

 

728x90

'JAVA' 카테고리의 다른 글

How to Convert CamelCase to UnderScore & UnderScore to CamelCase  (1) 2023.01.14
[JAVA] 스택 / 큐  (0) 2021.04.06