본문 바로가기

JAVA/Study

19. 비트연산자 - bit operator

비트연산자

    public static void main(String[] args) {
        //비트 연산자 : 2진수 연산 &(and) , | , ^ , ~(not,보수:complement) ,>>(오른쪽시프트), <<,>>>
        int a = 40;
        int b = 25;
       
        System.out.println("a & b =" +(a&b)); //and(&) 는 둘다 참(1)이여야 참(1)
        System.out.println("a | b = "+(a|b)); //or(|)는 둘중 하나가 참(1) 이여도 참(1)
        System.out.println("a^b = "+(a^b)); // ^(Xor)는 서로 값이 달라야 참
        System.out.println("~a = "+(~a));//-47이 맞으나 int는 4byte 체계라 불가
        System.out.println("a >> 2  :"+(a>>2)); //2번만큼 2씩곱하기 2진수에서 2번 앞으로 옮기기
        System.out.println("a << 2  :"+(a<<2)); //2번만큼 2씩나누기 2진수에서 2번 뒤로 당기기
//>>>는 n번만큼 우로 이동하고 나머지는 다 0으로 채우는것
    }

}
 
출력값 아래 부연설명이 더있으니 아래쪽을 더봐보세요

출력값

a & b =8
a | b = 57
a^b = 49
~a = -41 //-47이 맞으나 int는 4byte 체계라 불가
a >> 2  :10
a << 2  :160


 
 비트연산자 부연설명
 a&b가 8이 나온이유는
먼저 a=40에서 40을 2진수로 표기하고
b=25에서 25를 2진수를 표기하는것부터 시작하겠다
 

2진수로 변환해보면 각각 101000과 11001이 되는데

and(&)는 둘다 만족하는경우에만 이니까

둘다 1이 나온값외에 제외하면 2진수로 1000 즉 8이 나오게된다

 

이것을 이용해  or(|) 를 풀어보면 or는 둘중 하나만 만족해도 참(1) 이니

111001 즉 57이 나옴을 알 수 있다. 

이를 적용하여 나머지도 풀어보면된다 (사실안된다)


쉬프트연산자 부연설명

 

40을 2진수로 바꾸었을때

(아래 그림처럼 숫자를 써넣으면 계산하기편하다)

101000이 되는데

여기서  왼쪽으로 2칸을 이동하게되면

 

 

 

 

 

 

 

 

 

 

 

10100000이 되어 160이라는 숫자가 나오게된다

즉 왼쪽으로 한칸 이동할때마다 *2를 하는셈

오른쪽이동은 이와 반대로 생각하면 되고 오른쪽이동은 이동할때마다 /2를 하는셈이 된다