1. 이진수의 음수 표현
10진 음의 정수를 2진수로 변환하려면, 먼저 10진 음의 정수의 절대값을 2진수로 변환한다.
그 다음에 2진수의 '2의 보수'를 구하면 된다.
예를 들어 '-6'의 2진 표현을 구하는 과정은 다음과 같다.
// -6 ----> 6 ----> 0110 ----> 1010
// 절대값 2진수 2의보수
2. 보수
2의 보수법(2's complement)
어떤 수의 'n의 보수'는 더했을 때 n이 되는 수를 말한다.
7의 '10의 보수'는 3이고, 3의 '10의 보수'는 7이다.
3과 7은 '10의 보수의 관계'에 있다고 한다.
'2의 보수 관계' 역시, 더해서 2가 되는 두 수의 관계를 말하며 10진수 2는 2진수로 '10'이다.
2진수로 '10'은 자리올림이 발생하고 0이 되는 수를 뜻한다.
그래서 '2의 보수 관계'에 있는 두 2진수를 더하면 '(자리올림이 발생하고) 0이 된다.'
// 0 1 0 1 < 10진수로 5
// + 1 0 1 1 < 10진수로 -5
// -----------------
// 1 0 0 0 0 < 자리올림이 발생했으나 크기가 4비트라서 버려짐
위의 설명에서 알 수 있듯이 2진수 '0101'와 '1011'은 서로 '2의 보수 관계'에 있으며, 이 두 2진수를 더하면 0이 된다.
이 덧셈이 10진수로도 0이 되려면, 2진수 '0101'가 10진수로 5니까, 2진수 '1011'은 10진수로 -5이어야한다.
2의 보수 구하기
서로 '2의 보수'의 관계에 있는 두 수를 더하면 '0(자리올림 발생)'이 된다.
예를 들어 2진수 '0101'의 '2의 보수'를 구하려면, '0101'에 어떤 수를 더하면 0이 되는지 알아내야 한다.
// 0 1 0 1 + ? ? ? ? = 1 0 0 0 0
// 2의 보수
아래와 같이 뺄셈으로 '2의 보수'를 간단히 구할 수 있지만 자리수가 많아지면 뺄셈도 쉽지 않다.
// 1 0 0 0 0 - 0 1 0 1 = 1 0 1 1
// 2의 보수
다행히 뺄셈보다 '2의 보수'를 더 간단히 구하는 방법이 있다.
'1의 보수'를 구한 다음 1을 더한다. 그러면 2의 보수를 구할 수 있다.
// ? ? ? ? + 1의 보수 = 1 1 1 1
// ? ? ? ? + ( 1의 보수 + 1 ) = 1 1 1 1
// ? ? ? ? + 2의 보수 = 1 1 1 1
3. 자바의 printf
println 과 달리 정형화된 코드를 작성할 수 있습니다.
printf 가 println 이랑 다른 이유는 지시자를 사용하는 것입니다.
지시자 | 설명 |
%b | Boolean 형식으로 출력 |
%d | 10진(decimal) 정수의 형식으로 출력 |
%o | 8진(octal) 정수의 형식으로 출력 |
%x, %X | 16진(hexa-decimal) 정수의 형식으로 출력 |
%f | 부동 소수점(floating-point)의 형식으로 출력 |
%e, %E | 지수(exponent) 표현식의 형식으로 출력 |
%c | 문자(character)로 출력 |
%s | 문자열(string)로 출력 |
예제
public class PrintfEx1 {
public static void main(String[] args) {
byte b = 1;
short s = 2;
char c = '가';
int finger = 10;
long big = 100_000_000_000L;
long hex = 0xFFFF_FFFF_FFFF_FFFFL;
int octNum = 010;
int hexNum = 0x10;
int binNum = 0b10;
System.out.printf("b=%d%n", b);
System.out.printf("s=%d%n", s);
System.out.printf("c=%c, %d %n", c, (int)c);
System.out.printf("finger=[%5d]%n", finger); // %5d 다섯칸 확보하고 출력
System.out.printf("finger=[%-5d]%n", finger);
System.out.printf("finger=[%05d]%n", finger);
System.out.printf("big=%d%n", big);
System.out.printf("hex=%#x%n", hex); // 16진수 출력 %#로 바꾸면 대문자
System.out.printf("octNum=%o, %d%n", octNum, octNum);
System.out.printf("octNum=%x, %d%n", hexNum, hexNum);
System.out.printf("octNum=%s, %d%n", Integer.toBinaryString(binNum), binNum); // 문자열 출력
String str = "12345678901234567890";
System.out.printf("[%s]\n", str);
System.out.printf("[%30s]\n", str);
System.out.printf("[%-30s]\n", str);
System.out.printf("[%.5s]\n", str);
}
}
4. Scanner
자바에서 화면으로 부터 입력받는 방법은 여러 가지가 있으며, 점점 간단하고 편리한 방향으로 발전해 왔다. 최신 방법은 JDK1.6부터 추가된 Console클래스를 이용하는 것인데, 이 클래스는 이클립스와 같은 IDE에서 잘 작동하지 않으므로, 이와 유사한 Scanner 클래스를 이용하여 화면으로부터 입력받는 방법입니다.
먼저 Scanner 클래스를 사용하려면, 아래의 한 문장을 추가해줘야 한다.
import java.util.*;
그 다음엔 Scanner 클래스의 객체를 생성한다.
Scanner scanner = new Scanner(System.in);
그리고 nextLine() 이라는 메서드를 호출하면, 입력대기 상태에 있다가 입력을 마치고 '엔터키(Enter)'를 누르면 입력한 내용이 문자열로 반환된다.
String input = scanner.nextLine();
int num = Integer.parseInt(input);
이때 nextLine() 외에도 nextInt()와 같은 메서드를 사용할 수 있지만,
프로젝트와 같은 긴 코드를 작성할때에 오류가 날 수 있으므로 꼭 nextLine()을 사용하도록 한다!!
Scanner 예제
import java.util.Scanner;
public class ScannerEx {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // scanner 객체(참조형 변수) 생성
System.out.print("두자리 정수를 하나 입력해주세요 >>");
String input = scanner.nextLine();
int num = Integer.parseInt(input);
System.out.println("입력내용 : "+ input);
System.out.printf("num = %d\n", num);
}
}
댓글