• Do it! 자바 프로그래밍 입문 온라인 강의를 수강하며 작성하였습니다.
  • Section 0. 자바 기본 익히기
  • 2강 "변수와 자료형(1)"
  • 2진법과 16진법 -> 2진법에서 음수 표기 방법

1. 2진법과 16진법

컴퓨터는 0과 1로만 데이터를 저장한다.
bit(비트) : 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기
byte(바이트) : 1byte = 8bit

10진수2진수16진수
10000 000101
20000 001002
30000 001103
40000 010004
. . .. . .. . .
90000 100109
100000 10100A
110000 10110B
. . .. . .. . .
140000 11100E
150000 11110F
160001 000010

표에서 확인할 수 있듯이 16진수는 2진수 4bit를 한번에 표현 가능하다.
1111(2) = F(16)

public class BinaryTest {
	public static void main(String[] args) {
    
		int num = 10;
		int bNum = 0B1010;	// 2진수 1010 => 10진수로 10
		int oNum = 012;		// 8진수 12 => 10진수로 10
		int hNum = 0XA;		// 16진수 A => 10진수로 10
		
		System.out.println(num);
		System.out.println(bNum);
		System.out.println(oNum);
		System.out.println(hNum);
		
	}
}

2진수, 8진수, 16진수 표현 결과
Eclipse에서 실행해본 결과 모두 10이 나온다.
2진수는 0B, 8진수는 0, 16진수는 0X를 앞에 붙여서 표현 가능하다.
(2진수 : binary, 8진수 : octal, 16진수 : hexadecimal)

2. 2진법에서 음수 표현 방법

정수(Int)는 일반적으로 32bit로 표현한다. (0000 0000 0000 0000 0000 0000 0000 0000)
예시에서는 편의상 8bit로 표현하겠다.
맨 앞 숫자를 MSB(Most Significant Bit)라 하며 부호 비트로 사용되고,
부호비트가 0이면 양수, 1이면 음수가 된다.

-5를 2진수로 표현하는 방법

10진법 5를 2진법으로 표현하면 0000 0101 (2) 이다.
그러나 -5는 부호비트를 1로 바꿔서 1000 0101 (2) 로 표현하지 않는다.
왜냐하면 5와 -5를 더하면 0이 되어야 하므로 2진수끼리 더해도 0이 되어야 한다.
0이 아닌 두 수를 더해서 0이 될 수 없으므로 2의 보수를 더하는 방법을 사용한다.

  • 보수란, 상호 보완하는 수로, 임의의 수를 보완해주는 다른 임의의 수다.
  • 쉽게 말해서, 더해서 n이 되는 수를 "n의 보수" 라고 한다. ex) 4의 10의 보수는 6이다.
  • 80 - 48이라는 식이 있다고 했을 때, 48의 10의 보수는 52이고,
    80 + 52 = 132이므로, 여기서 삐져나온 자릿수 100을 빼면 32가 된다.

컴퓨터에서는 4bit로 표현했을 때, 1010(2) 와 0110(2) 를 더하면
1 0000 (2) 가 되는데 맨 앞의 1은 4bit를 초과하여 날아가서 결과가 0이 된다.
즉, 2의 보수를 더하면 결과가 0이 된다.

2의 보수를 간편하게 구하기 위해서 먼저 1의 보수를 취한 후 거기에 1을 더한다.

0000 0101 (2)
1111 1010 (2) <= 1의 보수
1111 1011 (2) <= 1의 보수에 1을 더함

최종적으로 0000 0101 (2) 와 1111 1011 (2) 를 더하면
1 0000 0000 (2) 가 되어 0이 되므로
-5는 2진법으로 1111 1011 (2) 로 표현하면 되겠다.

Eclipse에 직접 입력하여 결과를 확인해보자.

public class BinaryTest2 {
	public static void main(String[] args) {
		
		int num1 = 0B00000000000000000000000000000101;	//2진수 5
		int num2 = 0B11111111111111111111111111111011;	//2진수 -5
		
        System.out.println(num1);
		System.out.println(num2);
        System.out.println(num1 + num2);
	}
}


더한 결과가 0이 나오는 것을 확인할 수 있다.

profile
효율성을 추구하며 세상을 떠도는 철새입니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN