▶ bit와 byte

- 1bit는 0과 1로 표시할 수 있는 하나의 단위이며, 8 bit가 1byte이다.

- 8bit로 나타낼 수 있는 수는 256가지이다.

- 8bit를 4자리씩 끊으면 4bit 두개로 표현할 수 있고, 각 4자리는 16진수로 표현이 가능하므로, 16진수 두개로 8bit, 즉 1byte를 표현할 수 있다.

10진수 

2진수 

16진수 

0000 

0001 

0010 

0011 

0100 

0101 

0110 

0111 

1000 

1001 

10 

1010 

11 

1011 

12 

1100 

13 

1101 

14

1110 

15

1111 

 

▶비트 연산자

- 비트 연산자는 비트 단위로 데이터를 처리할 때 사용한다.

- 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; 

 

Print Friendly and PDF Posted by JJ*
: