본문 바로가기

Zero Base 백엔드 스쿨 6기

ZB BE 6th - Java 공부 #2-2 연산자 + 보수

1. 2진법 : 컴퓨터에서 데이터 표현에 사용, 2를 기반으로하는 숫자 체계.
10진수와 2진수 테이블

1 2 3 4 5 6 7 8 9 10
1 10 11 100 101 110 111 1000 1001 1010

1의 보수.
답이 양수가 나오는 식에서는 캐리(정해진 비트를 넘어선 비트)가 생겼을대 최하위 비트(젤 우측 비트)에다가 옮겨준다.
답이 음수가 나오는 식에서는 캐리가 발생하지 않으며, 1의보수를 한번 더 취하고 (반전=xor), -를 붙인다.
> 13 - 10 = 3
1101 - 1010 = 0011
1101 + 0101 = 0011
10010 = 0011
0011 = 0011 >> 맨 앞자리는 캐리라고 4비트를 벗어난 숫자. 이것을 최하위 비트에(제일 우측 비트) 옮겨준다. 

EX) 10 - 13 = -3
1010 - 1101 = -0011     // 10진수의 숫자들을 2진수로 변경
1010 + 0010 = -0011    // -를 무조건 +로 반전을 통해 (1의 보수를 취한다) 바꿔야함.
1100 = -0011              // 
- 0011 = - 0011

2의 보수.
1의 보수 값에 +1을 한다. 1의 보수와는 다르게 캐리값이 나왔을때 캐리값을 버린다.
캐리가 발생하지 않으면 다시 보수를 취한다. 그리고 - 값을 붙인다.

13 - 10 = 3
1101 - 1010 = 0011
1101 + 0101 = 0011 // 음수 - 1010을 1의 보수를 취한 다음(0101) +1을하여 2의 보수를 취해준다.
1101 + 0110 = 0011
10011 = 0011 // 양수에서는 캐리값 1 을 버린다.

10 - 13 = -3
1010 - 1101 = -0011
1010 + 0010 +0001 = -0011
1010 + 0011 = -0011
1101 = -0011 // 캐리가 발생하지 않았으므로 +1하여 2의 보수를 취하고 -를 붙인다.

 


2. 비트 연산자 : 비트 단위로 연산, 기본 연산자와 비트 연산자 비교.
[기본 연산사] 
5 && 3 
5 || 3
[비트 연산자]
0101 & 0011
0101 | 0011

3. 비트 논리 연산자
A. AND 연산자 (&) : 두 개의 비트 값이 모두 1인 경우에만 결과 1.

ex)
bit1 bit2 result
 0     0     0
 0     1     0
 1     0     0
 1     1     1
  
ex) 5&3 > 1
        bit1  bit2  bit3  bit4
  5       0     1     0     1
  3       0     0     1     1
result  0     0     0     1 

B. OR 연산자 (|) : 두 개의 비트 값 중 하나라도 1이면 결과 1

ex)
bit1 bit2 result
 0     0     0
 0     1     1
 1     0     1
 1     1     1

ex) 5|3 > 7
         bit1  bit2  bit3  bit4
5         0     1     0     1
3         0     0     1     1
result  0     1     1     1 

C. XOR 연산자(^) : 두 개의 비트 값이 같으면 0, 다르면 1

ex)
bit1 bit2 result
 0     0     0
 0     1     1
 1     0     1
 1     1     0


ex) 5^3 > 6
         bit1  bit2  bit3  bit4
5         0     1     0     1
3         0     0     1     1
result  0     1     1     0 

D. 반전 연산자(~) : 비트 값이 0이면 1로, 1이면 0으로 반전]
ex)
bit 1   Result
  0        1
  1        0

ex) ~5 -> -6
       bit1  bit2  bit3  bit4
5       0     1     0     1
result  1     0     1     0
>> 1 0 1 0 일때 2의 보수를 취해주면
0 1 0 1 + 0 0 0 1 = 0 1 1 0 후 - 붙이면. -6 

E. 비트 이동 연산자 ( <<, >>, >>> )
**중요 : <<, >> 의 경우 이동하고 비워진 bit1 자리에는 이동 전 기존 bit1 숫자 따라오지만

>>> 에는 비워진 bit1 자리에는 0으로 채워짐.

E-1 : << 연산자 : 비트를 왼쪽으로 이동. // N<<M 의 경우 결과값 = 2N됨. // 이동 후 bit1 자리는 기존의 bit 숫자 내려옴.
ex) int numA = 3; 

result = numA << 1;

3<<1 : 6 
          bit1  bit2  bit3  bit4
3          0     0      1     1
result   0     1     1     0 = 6

E-2 : >> 연산자 : 비트를 오른쪽으로 이동. // N << M의 경우 결과값 = N/2 됨. // 이동 후 bit1 자리는 기존의 bit 숫자옴.

ex) int numA = 3;

result = numA >> 1;

3>>1 : 1
        bit1  bit2  bit3  bit4
3        0     0      1     1
result  0     0      0     1  = 1

E-3 : >>> 연산자 : 비트를 오른쪽으로 이동 (이동 후 bit1 자리는 부호비트 상관없이 0으로 채움)