본문 바로가기

Java

비트 연산자 & 쉬프트 연산자

조건문을 사용할 때 && 나 || 같은 논리 연산자는 많이 사용하지만

 

비트 연산자는 비교적 많이 사용하지 않아서

 

자주 까먹는다. 이번 기회에 한번 정리하며 외우려고 한다.

 

*비트 연산자

-컴퓨터 내부 정보를 비트 단위로 비교하거나 조작 할 때 사용한다.

 

알 수 있는 사실은

컴퓨터 내부 정보이니 이진수로 표현 될 것이다.

int a = 5;

int b = 6;

a와b에 비트연산자를 사용하면

5는 101

6은 110

처럼 이진수로 변환되어서 비트연산을 실행할 것이다.

 

종류에는 네 가지가 있다. 

1. 논리곱(and) &

둘 다 1 일때만 1 아닐 땐 0 이다.

5 = 101

6 = 110

& = 100

 

int a = 5;

int b = 6;

System.out.print(a&b); 4출력

 

2. 논리합(or) |

둘 중 하나가 1이면 1이다.

5 = 101

6 = 110

| =  111

 

int a = 5;

int b = 6

System.out.print(a|b); 7출력

 

3. 배타적 논리합 (xor) ^

한쪽이 1이고 다른 한쪽이 0이면 1이다.

5 = 101

6 = 110

^ = 011

 

int a = 5;

int b = 6

System.out.print(a^b); 3출력

 

4 1의 보수 표현(not) ~

다른 종류와는 다르게 비교하는 연산이 아니다.

비트 값을 1의 보수로 바꾼다. 0은 1로 1은 0으로

5 = 101

~5 = 11111010 //부호비트가 1이며 - 이다.

 

int a =  5;

System.out.print(~a); -6출력

 

비트연산자인 &는

홀수인지 짝수인지 검사하는 if(N%2 == 1)의 경우에

if(N&1)로 대체할 수 있다.

왜냐면 홀수의 경우엔 2진수로 바꿨을 때 무조건 마지막자리에 1 이있기때문에

&1로 연산을하면 1이 나오게 된다.

예를 들어 3&1인경우엔 이진수로 11(2) 

11

  1

--- &

  1 이 나오게되어 if문이 true가 된다.

 

쉬프트연산자의 경우엔

int a = 3;

int b = 4;

일때 

2진수로 a와 b를 나타내면

a = 11(2)

b = 100 (2)

 

a>>1는

a의 비트를 오른쪽으로 1칸 만큼 이동 시키란 뜻이다

따라서 a는 =1(2)이 되고

10진수로 나타내도 1이다.

b>>1의 경우엔

b = 10(2)이 되고 10진수로 나타내면 2가 된다.

 

<<의 경우도 마찬가지로 왼쪽으로 이동시키면 된다.

a << 1 은 110(2)이 되고 10진수로 6이 된다.

 

따라서 A << B 는 A*2^B와 같다

A >> B의 경우엔 A/2^B와 같다.

또한

(A+B)/2 는 (A+B)>>1  과같다.