자바(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