열혈 Java 프로그래밍

[윤성우의 열혈 Java 프로그래밍] Chapter 04 비트 연산자

잉여진행중 2020. 7. 20. 11:10

개인적으로 헷갈리는 것 중요한 것 위주로 정리해두고 연습문제를 풀어본 글입니다.

 

- 비트 연산자 : 비트를 대상으로 진행하는 연산자로 정수만 가능하다.

 

&    AND 연산 : 두 비트가 모두 1일 때 1 반환

 |      OR 연산  : 두 비트 중 하나라도 1이면 1 반환 

^     XOR 연산 : 두 비트가 서로 다른 값이면 1 반환

~      !와 같음 not : 비트를 0에서 1로, 1에서 0으로 반환 (반전)

 

& 연산이 int형 연산이 가능하므로 byte로 형변환 해줌

   n1 = 0 0 0 0 1 1 0 1

   n2 = 0 0 0 0 0 1 1 1 

&_______________________

          0 0 0 0 0 1 0 1   각 비트마다 연산을 한다.   

 

 

- 비트 쉬프트 연산자

 

<< : 비트열을 왼쪽으로 / 빈공간은 0

>> : 비트열을 오른쪽으로 / 빈공간은 음수면 1, 양수면 0

>>> : 비트열을 오른쪽으로 / 빈공간은 0

 

저 중에서 -8 의 (num >> 2)를 설명한다면,

 

-8의 비트는 8을 보수연산하여 구한다.

8 = 0 0 0 0 1 0 0 0 

1의 보수 : 1 1 1 1 0 1 1 1 

2의 보수 : 1 1 1 1 1 0 0 0 

-8 = 1 1 1 1 1 0 0 0

 

이 비트열을 오른쪽으로 2칸 민다. 음수이므로 빈칸은 1로 채운다.

= 1 1 1 1 1 1 1 0

 

이 비트값을 다시 보수연산을 하여 수를 구하고 - 를 붙이면 된다.

-8 = 1 1 1 1 1 1 1 0

1의 보수 : 0 0 0 0 0 0 0 1

2의 보수 : 0 0 0 0 0 0 1 0 = 2

따라서,  -8 의 (num >> 2)의 값은 -2 이다.


<문제 04-2>

문제 1.

좀 더 간단한 방법이 존재하지만 나는 이렇게 풀었다..

새로운 변수 mun을 만들 필요도 없이 num만 사용해도 가능하고 

int 형으로 선언해도 ~연산자에서 비트로 변환하기 때문에 괜찮다. 고 생각한다.

 

문제 2.

처음에 15678을 비트로 표현할 수 있는지에 생각이 멈췄는데

비트로 표현의 문제가 아니라 알고 싶은 비트를 그저 움직이기만 하면 되는 것이었다.