본문 바로가기
JAVA BASE/operator(연산자)

07. [자바] 비트 연산자 &, |, ^, ~, <<, >>

by staticClass 2020. 12. 3.

비트 연산자란?

비트 연산자는 피연산자를 비트단위로 논리 연산한다. 피연산자를 이진수로 표현했을 때의
각 자리를 알아보자

|(OR연산자) 피연산자 중 한 쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
&(AND연산자) 피연산자 양 쪽의 값이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
^(XOR연산자) 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

|(OR연산자 )

대상1 0 0 0 0 1 1 1 1
대상2 0 0 0 1 1 0 0 1
결과 0 0 0 1 1 1 1 1

2진수로 표현된 두 비트가 중 하나라도 1일 경우에 연산 결과가 1로 표현됨.

&(AND연산자)

대상1 0 0 0 0 1 1 1 1
대상2 0 0 0 1 1 0 0 1
결과 0 0 0 0 1 0 0 1

2진수로 표현된 두 비트가 모두 1일 경우에만 연산결과가 1로 표현됨.

^(XOR연산자)

대상1 0 0 0 0 1 1 1 1
대상2 0 0 0 1 1 0 0 1
결과 0 0 0 1 0 1 1 0

2진수로 표현된 두 비트가 하나는 1이고 다른 하나가 0일 경우에 연산 결과가 1로 표현됨.

^(XOR)연산한 값에 다시 ^(XOR)연산을 하게 되면 원래의 값으로 돌아오는 특징이 있어서 간단한 암호화에 사용된다.

~(비트 전환 연산자)

대상 0 0 0 0 1 0 1 0
결과 1 1 1 1 0 1 0 1

2진수로 표현 했을 때, 0은 1로, 1은 0으로 바꾼다. 논리 부정 연산자 '!'와 유사하다.

ex) ~10 = -11

쉬프트 연산자 <<, >>

이 연산자는 피연산자의 각 자리(2진수로 표현했을 때)를 '오른쪽 >>' 또는 '왼쪽 <<'으로 이동(shift)한다고 해서

'쉬프트 연산자(shift operator)'이다.

x << y  : 정수 x의 각 비트를 y만큼 왼쪽으로 이동시킨다.(빈자리는 0으로 채워짐)
x >> y  : 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다.(빈자리는 최상위 부호비트와 같은 값으로 채워짐)
x >>> y : 정수 x의 각 비트를 y만큼 오른쪽으로 이동시킨다.(빈자리는 0으로 채워짐)

 

 

⚓10진수 8은 2진수로 '00001000'이다.

0 0 0 0 1 0 0 0

✔ 8 << 2는 8의 2진수를 왼쪽으로 2칸 움직인다. (빈칸은 0으로 채워진다.)

0 0 1 0 0 0 0 0

✔ 8 >> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 최상위 부호비트와 같은 값으로 채워진다)

0 0 0 0 0 0 1 0

✔ 8 >>> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 0으로 채원진다)

0 0 0 0 0 0 1 0

 

 

⚓10진수 -8은 2진수로 '11111000'이다.

1 1 1 1 1 0 0 0

✔ 8 << 2는 8의 2진수를 왼쪽으로 2칸 움직인다. (빈칸은 0으로 채워진다.)

1 1 1 0 0 0 0 0

✔ 8 >> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 최상위 부호비트와 같은 값으로 채워진다)

1 1 1 1 1 1 1 0

✔ 8 >>> 2는 8의 2진수를 오른쪽으로 2칸 움직인다. (빈칸은 0으로 채원진다)

0 0 1 1 1 1 1 0

 

그래서 머선 일에 쓰는게 좋응가?

비트연산에 대해 알아보면서 각 비트 연산자가 어떤연산을 하는지 2진수의 형태로 풀어 보았다.

아마 대부분의 '사람들이 그래서 어쩌라고😑' 와 같은 생각을 할것이다.

 

그래서 일단 쉬프트 연산자를 사용법에 대해 알아보려 한다.

x << n 은 x * 2(n제곱)의 결과와 같다
x >> n 은 x / 2(n제곱)의 결과와 같다

위의 설명과 같이 곱셈과 나눗셈이 가능하며 쉬프트 연산자가 덧셈, 나눗셈 연산자보다 프로그램의 실행속도도 빠르다

계산 관련된 프로그램을 작성할때 사용 할수 있겠다.

하지만 또 반전이 있다 가독성이 떨어진다 속도는 빠르겠지만 분명 *, / 보다 가독성이 떨어지는게 사실이니

쉬프트 연산자보다는 곱셈 나눗셈 연산자를 더 주로 사용하다가 

보다 빠른 실행이 요구되어질때 적절하게 쉬프트 연산을 사용하도록 하자.

 

비트연산자는 ^(XOR연산자)에 주목하면 좋을 것 같다 

^(XOR연산자)는 간단한 암호화나 복호화가 가능하여 직접 만들어보았다.

 

[JAVA] 비트연산자를 활용한 암호화 복호화

한창 빨빨대며 공부하다가 일을 처음 시작할 때 나의 호기심을 자극했던 암호화 복호화! 토이 프로젝트를 할 때 회원 비밀번호를 암호화해야 한다는 생각조차 하지 않았다가 처음 보고 궁금해

staticclass.tistory.com

바로 간단하지만 암호화와 복호화가 가능한 프로그램을 만들수 있었다. 😉

 


비트연산과 쉬프트 연산을 공부하며 이걸 내가 필요에 의해서 코드에 작성할 일이 있을까?
하고 생각했는데 공부하다보니 의외로 쓸곳이 있다는걸 알게 되었고
또 그 쓸곳이 쉬프트 연산의 곱셈 나눗셈 이라는걸 알고 나니 기억의 조작인지
예전에 코드를 읽다가 한두번쯤 본것 같은 착각도 들었다.
또 내가 애정하게 되버린 XOR연산자를 이용해 간단한 암호화와 복호화 프로그램을 작성하면서
쉬프트연산, XOR연산을 내가 필요해서 쓰는 날이 오길 기대하게 됐다.

댓글