오랜만에 글을 올립니다. 벌써 6월이 되었군요. 지난번 연재중이었던 TRIANGULATE, TRIGRID 관련 내용은 준비되는대로 계속 이어나가기로 하겠습니다. 오늘은 다른 주제를 다뤄보고자 하는데요. 포맷 코드들 중 B, I, O, Z에 관하여 언급해보고자 합니다. 사실포맷 코드에 관해서는 제가 작년 요맘 때쯤(2015년 6월) 게시물을 올린 적이 있었는데, 가장 기본적인 포맷 코드인 I, F, A 등에 관하여 언급을 했었습니다. 사실 IDL안에는 이러한 기본적인 포맷 코드외에 매우 다양한 종류의 포맷 코드들이 존재합니다. 그 중 오늘은 다소 생소할 수 있는 B, I, O, Z를 알아보기로 하겠습니다. 이 포맷 코드들은 숫자를 다음과 같은 형태의 문자로 표시하는 역할을 합니다.
B : binary (이진수)
I : decimal (십진수)
O : octal (8진수)
Z : hexadecimal (16진수)
예를 들어 5라는 숫자(십진수)를 이진수로 표시하면 101이 될텐데, 이러한 형태로 출력하려면 다음과 같이 하면 됩니다.
IDL> print, 5, format='(B)'
101
물론 B 뒤에 필드수를 지정할 수도 있습니다. 필드를 10으로 지정할 경우에는 다음과 같이 공백 7개 뒤에 숫자 101이 출력되는 방식입니다.
IDL> print, 5, format='(B10)'
101
그리고 다음과 같이 필드수및 자리수까지 지정하면, 비어있는 필드에는 무조건 숫자를 채워넣게 됩니다. 이 경우라면 비어있던 필드들은 0으로 채워지게 됩니다.
IDL> print, 5, format='(B10.10)'
0000000101
이어지는 I의 경우는 전에도 언급했던 정수 표시용 기술자 I와 똑같습니다. 따라서 여기서 굳이 더 언급할 필요는 없을 것 같습니다. 바로 이어지는 O의 경우는 8진수입니다. 십진수 8을 8진수로 표현하면 10이 됩니다. 이러한 방식으로 출력하려면 다음과 같이 하면 됩니다.
IDL> print, 8, format='(O)'
10
십진수 67의 경우에는 8진수로 103이 되는데, 역시 다음과 같은 요령으로 하면 됩니다. 물론 필드수 및 자리수의 설정 모두 가능합니다.
IDL> print, 67, format='(O5.5)'
00103
16진수의 경우는 아시다시피 1~9까지의 숫자 및 A~F의 알파벳으로 표시하는 방식을 따르는데, Z 코드를 사용하면 이러한 표현이 가능합니다. 십진수 10은 16진수로 A가 됩니다. 이러한 방식으로 출력하려면 다음과 같이 하면 됩니다.
IDL> print, 10, format='(Z)'
A
물론 필드수 및 자리수 설정 모두 가능합니다. 다음은 십진수 106 및 255를 16진수로 표시하는 예제들입니다.
IDL> print, 106, format='(Z2)'
6A
IDL> print, 255, format='(Z2)'
FF
그런데 필드수나 자리수를 지정하지 않고 포맷 코드 알파벳만 적을 경우, 위의 예제들에서 보았듯이 항상 약간의 공백들을 두고 실제 문자값이 찍힌다는 것을 알 수 있습니다. 물론 필드수까지 지정하면 앞부분의 공백을 제거할 수는 있습니다. 하지만 큰 값을 변환할 경우 그 필드수가 정확히 몇 개를 필요로 하는지 사전에 파악하기 힘들 수도 있습니다. 예를 들어 십진수 2780을 이진수로 바꿀 경우필드수가 몇 개 필요할까요? 다음과 같이 출력을 해본 후 직접 갯수를 세어야 하는데 이건 좀 번거롭다는 생각이 드는 것이 사실입니다.
IDL> print, 2780, format='(B)'
101011011100
따라서 앞쪽에 항상 붙는 디폴트 공백을 무조건 없애도록 하고 싶을 경우가 분명히 있습니다. 이를 위해서는 필드수를 아예 0으로 해주면 됩니다. 즉, 위의 내용 대신 다음과 같은 방식으로 하면 됩니다.
IDL> print, 2780, format='(B0)'
101011011100
그런데 반대 방향의 변환은 어떨까요? 즉, 예를 들어 값을 알고 있는 십진수를 이진수로 바꿔 표시하는 것이 아니라, 값을 알고 있는 이진수를 그대로 사용하거나 십진수로 표시하고 싶을 경우를 뜻합니다. 이진수 101을 그 자체로 사용하기 위해서는 다음과 같이 이진수 자체를 따옴표로 둘러싼 후 바로 뒤에 알파벳 B(대소문자 구분 없음)를 붙이는 표기법을 사용하면 됩니다.
IDL> print, '101'b
5
8진수 및 16진수로 유사한 방식을 지원합니다. 다만 사용되는 알파벳이 각각 O와 X가 되어야 합니다. 이를 이용하면 다음과 같이 8진수 11이 십진수로 9가 되는 것 그리고 16진수 FF가 십진수로 255가 되는 것을 확인할 수 있습니다.
IDL> print, '11'o
9
IDL> print, 'ff'x
255
이러한 표기법들은 특히 Bitwise연산 또는 DG 체계에서 RGB 색상값을 설정하는 작업 등에 있어서 매우 유용하게 사용될 수 있다는 점을 참조해두시면 도움이 될 것 같습니다.
'IDL > Programming' 카테고리의 다른 글
SAVE 명령 및 IDL_SAVEFILE 클래스의 사용에 관하여 [1] (0) | 2016.06.22 |
---|---|
배열 인덱싱을 배열로 할 경우의 유의사항 (0) | 2016.06.09 |
터미널 프롬프트상에서 IDL 프로그램의 실행에 관하여 (0) | 2016.03.28 |
NaN 값의 이해와 활용 [2] (0) | 2016.01.15 |
NaN 값의 이해와 활용 [1] (0) | 2016.01.08 |