[Java] System.in.read()

Algorithm 2022. 11. 1. 01:55

- @참고: https://blog.naver.com/jihogrammer/222314445259

 

아래와 같은 형태로 입력되는 입력값을 빠르게 받기는 법

2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5

 

- 코드

private static int read() throws Exception {

    int c, n = System.in.read() & 15;

    while ((c = System.in.read()) > 32)
        n = (n << 3) + (n << 1) + (c & 15);

    if (c == 13) System.in.read();

    return n;

}
[출처] [Java] System.in.read() - 3|작성자 jihogrammer

 

코드 주석

# n = System.in.read() & 15;

15 = 1111(2) 이고

n = System.in.read() 일 때, 한글자의 수를 읽으면 48 <= n <= 57

48 = 32 + 16 = 2^5 + 2^4 이므로 4, 5번째 자리를 제외한 하위비트만 읽어오면 48를 빼는것과 같아진다.

뺄셈을 연산하지 않고도 단순 비트 연산을 통해 읽을 수 있다.

Char	ASCII	Binary
'0' ==	48	== 11_0000
'1' == 	49  == 11_0001
'2' ==	50  == 11_0010
...
'9'	== 	57	== 11_1001

n & 15 연산을 수행하여 뒤 4자리 비트만 읽을 수 있다.

 

# n = (n << 3) + (n << 1) + (c & 15);

위 식은에서 (c & 15) 앞쪽은  n = n * 8 + n * 2 

= n * 10 이다.

왜 이렇게 표현했는가 하면,

* 연산은 생각보다 ALU에서 처리하는 양이 많다. (내부적으로 shift 연산과 add 연산을 반복적으로 수행하기 때문에)

최적화 되어있는 방식으로 표현하여 수행속도를 빨리하기 위함이다.

블로그 이미지

uchacha

개발자 일지

,