자바(Java) 프로그래밍, 연산자 이야기 Part. 2 비트 연산자

반응형
728x90
반응형

비트 연산자

1. 비트 논리 연산자

1-1. & 연산자

int num1 = 5;
int num2 = 10;
int result = num1 & num2;

위 코드를 보자 변수 num1은 5, 변수 num2는 10으로 선언 되었다.

& 연산 결과인 result를 출력하면 무엇이 출력 될까? 15? 아니다 0이다.

컴퓨터 내부에서 5와 10을 2진수로 표현해보자.

5  = 00000101
10 = 00001010

5를 2진수로 표현하면 '00000101' 이고

10을 2진수로 표현하면 '00001010'이다.

& 연산은 각 자리에 해당하는 비트 값이 1인 경우에 1, 다르면 0이다.

따라서 5와 10을 2진수로 표현하고 각 자리가 1,0 또는 0,0 이기 때문에

출력값은 0이 출력 되는 것이다

1-2. | 연산자

int num1 = 5;
int num2 = 10;
int result = num1 | num2;

| 연산자는 둘 중 하나라도 1이면 1 둘다 0이면 0이 된다.

따라서 5와 10은 | 연산 하면 결과는 '00001111'이 나오게 되고

10진수로 변환 하면 15가 출력 된다.

1-3. ^ 연산자

int num1 = 5;
int num2 = 10;
int result = num1 ^ num2;

^ 연산은 각 자리에 해당하는 값이 같으면 0, 다르면 1이 된다.

따라서 5와 10을 ^연산 하면 결과는 '00001111'이 나오고

10진수로 변환하면 15가 나오게 된다.

1-4. ~ 연산자

int num1 = 10;
int result = ~num1;

~ 연산자는 값을 2진수로 변환하였을 때

각 자리의 값이 0이면 1로 바꾸고, 1이면 0으로 바꾼다

10을 2진수로 바꾸면 '00001010'이고

~연산을 처리하면 '11110101'이 된다.

이 값을 10진수로 변환하면 11이 된다.

그런데 위의 경우 부호 비트가 1이기 때문에 음수인 -11이 된다.

 

2. 비트 이동 연산자

비트 이동 연산자는 <<, >>, >>> 이렇게 세 가지가 있다.

이를 시프트(shift) 연산자라고 부르기도 한다.

2-1. << 연산자

int num = 5;
num << 2;

위 의 코드를 보자. 정수 5를 num 변수에 대입하고

'num << 2' num 값의 비트를 두 칸씩 왼쪽으로 이동해줘!

라고 코드를 입력하였다

5를 2진수로 바꾸면 '00000101'이고 

두 번째 코드가 실행 되면 '00010100'이 된다.

왼쪽으로 n비트 이동한다는 것은 기존 값에 2의 n승 만큼 곱한다는 뜻이다.

따라서 5* 2의 2승 즉, 5*4가 되어 20이라는 값이 출력 되게 된다.

2-2.  >> 연산자

int num = 10;
num >> 2;

위 의 코드를 보자. 정수 10를 num 변수에 대입하고

'num >> 2' num 값의 비트를 두 칸씩 오른쪽으로 이동해줘!

라고 코드를 입력하였다

10를 2진수로 바꾸면 '00001010'이고 

두 번째 코드가 실행 되면 '00000010'이 된다.

오른쪽으로 n비트 이동한다는 것은 기존 값에 2의 n승 만큼 나눈다는 뜻이다.

따라서 10/2의 2승 즉, 10/4로 해석이되고 결과 값은 2가 된다.

2-3.  >>> 연산자

>>> 시프트 연산자는 >> 연산과 동일하게 비트를 오른쪽으로 이동시킨다.

차이점이 있다면 >>> 연산자는 왼쪽에 채워지는 비트 값이

부호비트와 상관 없이 무조건 0이 된다.

package operator;

public class OperatorEx5 {

	public static void main(String[] args) {
		int num = 0B00000101;
		
		System.out.println(num);
		System.out.println(num << 2);
		System.out.println(num >> 2);
		System.out.println(num >>> 2);
		
		num = num << 2;
		System.out.println(num);
		
	}

}

num만 출력하면 5가 나오고

num << 2의 출력은 20.

num >> 2의 출력은 1.

num >>> 2의 출력도 역시 1이 출력 된다.

 

3. 연산자의 우선 순위

  • 단항 연산자가 가장 높고 이항, 삼항 연산자 순서다.
  • 대입 연산자의 우선 순위가 가장 낮다
  • 산술, 관계, 논리, 대입 연산자 순서로 우선순위를 가지며 ()의 우선순위가 가장 높다.

 

728x90
반응형

댓글

Designed by JB FACTORY