don't stop believing

Golang << 와 >> 연산자 (그리고 메모리 사이즈 계산) 본문

Golang/Basic

Golang << 와 >> 연산자 (그리고 메모리 사이즈 계산)

Tongchun 2019. 2. 28. 12:08

Gin의 기능을 확인하다 아래와 같은 코드를 확인확인했습니다.

r.MaxMultipartMemory = 8 << 20

메모리 사이즈를 할당하는 설정인데 << 연산자는 알고 있으나 써보는 것은 처음이라 정리하고 갑니다.


우선 << 와 >> 연산자부터 확인하겠습니다.

비트 이동 연산자로 영어로는 Left Shift (<<), Right Shift (>>) 입니다.

비트 이동 연산자는 정수형에만 사용됩니다.


<< (Left Shift Operator)

현재 값의 비트를 특정 횟수만큼 왼쪽으로 이동합니다.

a := 7 // 정수 7은 비트로 00000111 입니다. b := a << 2 // 00000111 인 a의 비트를 왼쪽으로 2번 이동합니다. fmt.Printf("%08b", b) // 비트로 확인하면 00011100이 됩니다. 정수로는 28입니다.


>> (Right Shift Operator)

마찬가지로 현재 값의 비트를 특정 횟수만큼 오른쪽으로 이동합니다.

a := 112              // 정수 112는 비트로 01110000 입니다.
b := a >> 3           // 01110000인 비트를 오른쪽으로 3번 이동합니다.
fmt.Printf("%08b", b) // 비트로 확인하면 00001110이 되고 정수로는 14입니다.

만약 오른쪽으로 5번 이동하게 되면 00000011이 되고 정수로는 13이 됩니다.


이제 Gin에서 봤던 메모리 설정 코드입니다.

파일 업로드를 하는데 업로드되는 파일의 사이즈를 메모리에 할당 할 수 있도록 설정을 하게 됩니다.

// Set a lower memory limit for multipart forms (default is 32 MiB)
r.MaxMultipartMemory = 8 << 20 // 8 MiB

여기서도 먼저 확인해야 할 것은 MiB 입니다. Mebibyte 입니다.

쉽게 설명된 것을 찾다가 아래와 같은 글을 확인했습니다.

Differences between Megabyte and Mebibyte (MB vs MiB)

Both Megabyte (MB) and Mebibyte (MiB) are units of information or computer storage. But MB is used in two ways either as equivalent to 1000 Kb or 1024 Kb. This creates some sort of confusion. To avoid this, the International Electrotechnical Commission (IEC) (1998), the leading international organization for worldwide standardization in electrotechnology, approved as an IEC International Standard names and symbols for prefixes for binary multiples for use in the fields of data processing and data transmission. They recommended the use of Mebibyte (a combination of Mega and Binary) MiB, which always refer to 1024 Kb. See the table for percentage difference in storage size in MB and MiB. The difference is significant as the storage size increases. 

보통은 1 MB라고 하면 1000 Kb인지 1024 Kb 구분하기 어려웠습니다. 바이너리 데이터 단위를 표시하기 위해 MiB가 사용됩니다.

1 MB라고 하면 1000 Kb이거나 또는 1024 Kb일 수 있지만 1 MiB는 1024 Kb가 됩니다.

간단한 표로 보면 아래와 같습니다.


바이트 크기

SI 접두어

전통적 용법

이진 접두어

기호(이름)

값 

기호 

값 

기호(이름) 

값 

KB (킬로바이트)

1000¹ = 10³

KB

1024¹ = 2¹

KiB (키비바이트)

2¹⁰

MB (메가바이트)

1000² = 10

MB

1024² = 2²⁰

MiB (메비바이트)

2²⁰

GB (기가바이트)

1000³ = 10⁹

GB

1024³ = 2³⁰

GiB (기비바이트)

2³⁰

TB (테라바이트)

1000⁴ = 10¹²

TB

1024⁴ = 2⁴⁰TiB (테비바이트)

2⁴⁰

PB (페타바이트)1000⁵ = 10¹⁵

PB

1024⁵ = 2⁵⁰PiB (페비바이트)

2⁵⁰

EB (엑사바이트)

1000⁶ = 10¹⁸EB1024⁶ = 2⁶⁰

EiB (엑스비바이트)

2⁶⁰

ZB (제타바이트)1000⁷ = 10²¹ZB1024⁷ = 2⁷⁰

ZiB (제비바이트)

2⁷⁰

YB (요타바이트)

1000⁸ = 10²⁴

YB

1024⁸ = 2⁸⁰

YiB (요비바이트)

2⁸⁰


이제 다시 설정값을 확인해 봅니다.

r.MaxMultipartMemory = 8 << 20


8의 bit인 1000을 왼쪽으로 20번 이동시키면 100000000000000000000000이 되고 정수로는 8388608이 됩니다.

MiB인 2의 20승은 1048576 입니다. 8 MiB는 8388608 입니다.

즉 8 << 20 은 8 MiB인 것입니다.

만약 메모리에 32 MiB를 설정하고 싶다면 32 << 20 으로 하면 됩니다.

추가로 2 GiB를 메모리에 할당하고 싶다면 2 << 30 인 것입니다.


앞으로 메모리 사이즈를 할당할 경우에는 비트 이동 연산자를 이용해 표현하면 편리할 것 같습니다.


'Golang > Basic' 카테고리의 다른 글

Gnome Sort - 난쟁이 정렬  (0) 2019.04.25
Cocktail Sort - 칵테일 정렬  (0) 2019.04.22
Merge Sort - 병합 정렬  (0) 2019.04.20
Selection Sort - 선택 정렬  (0) 2019.04.19
Bubble Sort - 버블 정렬  (0) 2019.04.18
Comments