Programming

; develop a program

Back-End/Java

[Java] 비트 연산자

Clloud_ 2023. 1. 28. 10:30
반응형

이번 포스팅에서는 자바(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