[자바의 신 부록] 비트 연산자란 ?
[Programming]/Java 2015. 1. 3. 18:26 |▶ bit와 byte
- 1bit는 0과 1로 표시할 수 있는 하나의 단위이며, 8 bit가 1byte이다.
- 8bit로 나타낼 수 있는 수는 256가지이다.
- 8bit를 4자리씩 끊으면 4bit 두개로 표현할 수 있고, 각 4자리는 16진수로 표현이 가능하므로, 16진수 두개로 8bit, 즉 1byte를 표현할 수 있다.
10진수 |
2진수 |
16진수 |
0 |
0000 |
0 |
1 |
0001 |
1 |
2 |
0010 |
2 |
3 |
0011 |
3 |
4 |
0100 |
4 |
5 |
0101 |
5 |
6 |
0110 |
6 |
7 |
0111 |
7 |
8 |
1000 |
8 |
9 |
1001 |
9 |
10 |
1010 |
A |
11 |
1011 |
B |
12 |
1100 |
C |
13 |
1101 |
D |
14 |
1110 |
E |
15 |
1111 |
F |
▶비트 연산자
- 비트 연산자는 비트 단위로 데이터를 처리할 때 사용한다.
- C는 비트 연산을 많이 했지만, 자바에서는 API가 풍부하게 제공되므로 비트 연산자를 사용할 일은 그다지 많지 않다.
- 그러나 CPU의 성능이 아주 느린 작은 장비에 들어가는 프로그램을 작성하거나, 암호화 작업과 관련된 작업을 할 때에는 조금이라도 메모리를 줄이고, 성능을 개선하기 위해서 필요할 수도 있다. (즉 일반적인 웹 프로그램에서는 많이 사용하지 않는다.)
bitwise 연산자(두개의 숫자를 비교) |
bit shift 연산자(비트 이동) | ||
& |
AND연산 |
<< |
왼쪽 이동 |
| |
OR연산(inclusive OR연산) |
>> |
오른쪽 이동 |
^ |
XOR연산(exclusive OR연산) |
>>> |
부호 상관 없는(unsigned) 오른쪽 이동 |
~ |
unary연산(Not연산) (숫자 하나 필요) |
▷ bitwise연산자 (두개 숫자 비교)
- AND 연산은 둘다 1일 때만 1 나옴.
- OR 연산은 둘중 하나만 1이어도 1나옴. (둘다 0일 때만 0 나옴)
- XOR연산은 두 수가 같을 때는 0, 다르면 1 나옴.
ex) 직접 계산해 봅시다. (2진수로 변환해서)
① 1 & 3 ② 1 | 3 ③ 1 ^ 3 ④ 10 & -10 ⑤ 10 | -10 ⑥ 10 ^ -10 |
[참고] 음수를 2진수로 표현하는 방법 (원리 : 두 수를 합쳐서 1이 나오도록 한다고 생각하면 된다.) |
(만약, 음수로 표현된 2진수를 10진수로 어떤 값인지 알고 싶을 때도 같은 방식으로 하면 된다.) i) 음수로 바꾸고자 하는 10진수 양수를 우선 2진수로 표현한다. ii) 1의 보수로 바꿔준다. (해당 2진수의 1과 0을 다 반대로 바꿔줌) iii) 그 값에 1을 더하면 2의 보수가 된다. (1과 1을 더하면 0이 되고 남은 1이 위로 올라감. 1과 0 더하면 1)
** 가장 앞에 있는 bit값이 1로 시작하면 음수이다. 음수로 표현된 2진수가 10진수로 바꾸면 어떤 음수인지 알고 싶을 때에는, 1의 보수처리 해준 뒤, 1을 더해서 나온 2진수 값으로, 10진수인 양수를 구한 뒤, 그것에 -(마이너스)붙인 값이다. ex) 11111100(2) → 1의 보수 : 00000011 → +1 = 00000100(2) = 4(10) 즉, 앞에 써있는 11111100(2) = -4(10)
|
▷ unary 연산자(~) : 비트 연산자 중 유일한 단항 연산자
ex) a = 00000001 = 1(10) ~a = 11111110 = -2(10) b = 11110110 = -10(10) ~b = 00001001 = 9(10) c = 0000 0000 1111 1111 = 255(10) ~c = 1111 1111 0000 0000 = -256(10) d = 0000 0000 0000 0000 = 0(10) ~d = 1111 1111 1111 1111 = -1(10) |
▷ bit shift 연산자
[문법]
이동할숫자 << 이동 횟수 |
- << 연산자는 비트 값들을 왼쪽으로 한 칸씩 옮긴 후 빈공간에는 모두 0으로 채운다.
- << 연산자로 계속 이동을 하다가, 가장 왼쪽의 값이 1이 되면, int타입의 최소 음수인 -2,147,483,648 이 되고, 한번 더 좌측으로 이동하면 모든 값이 0으로 바뀌어 버리고, 모든 값이 0인 경우에 더이상 좌측으로 옮겨봤자 소용이 없다.
ex) 간단히 8bit짜리로 보겠음. a = 00000001 = 1(10) a<<1 = 00000010 = 2(10) a<<2 = 00000100 = 4(10) a<<3 = 00001000 = 8(10) |
[주의] >>연산자 |
>> 연산자도 비트 값을 오른쪽으로 한 칸씩 옮긴 후 빈공간에는 모두 0으로 채운다. 그런데, 최소 음수 값인 1000 0000 ..(생략).. 0000 = -2,147,483,648(10) 을 >> 연산자로 연산하면, 어떻게 될까?
음수의 경우는 0에 가까운 음수일 수록 앞부분은 모두 1로 채워졌으므로, 음수를 비트 이동(>>)하게 되면 이동된 빈 자리에는 0이 아닌 1로 채워진다. (>>>연산자는 부호 신경안씀) (음수의 최종 이동 결과 값은 -1이 된다.) |
>>연산자 |
>>> 연산자 |
공통점 : 오른쪽 이동(양수의 경우 우측으로 한 칸씩 옮긴 후 빈공간에 모두 0으로 채움) | |
음수의 경우 이동된 빈 자리에 0이 아닌 1로 채운다. |
음수의 경우에도 이동된 빈 자리에 0을 그대로 채운다. (부호를 신경쓰지 않음.) |
[참고] <<< 연산자가 없는 이유 ? |
<< 연산자는 음수이건 양수이건 상관없이 결과가 동일하기 때문에, 굳이 <<<연산자를 만들어줄 필요가 없다. >>>연산자가 있는 이유는, >>연산자가 음수와 양수를 차별하는 연산자이므로 >>>연산자를 별도로 만들어준 것이다. |
▶간략하게 비트 연산 수행
연산자 |
예 |
풀어쓰기 |
&= |
a&=b; |
a = a&=b |
|= |
a|=b; |
a = a|b; |
^= |
a^=b; |
a = a^b; |
<<= |
a<<=b; |
a = a<<b; |
>>= |
a>>=b; |
a = a>>b; |
>>>= |
a>>>=b; |
a = a >>> b; |
'[Programming] > Java' 카테고리의 다른 글
Java의 기초 문법★ (0) | 2015.01.04 |
---|---|
[자바의 신 부록] 자바의 역사와 JVM (0) | 2015.01.04 |
[자바의 신 부록] float와 double의 범위 (0) | 2015.01.03 |
[자바의신 부록] jdk / eclipse 설치하기 (0) | 2015.01.03 |