[진법변환 원리]
static String[] _36Index =
{"0","1","2","3","4","5","6","7","8","9",
"A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"};
10진수 -> 36진수
계산공식 : 36으로 소인수 분해
예) [10진수에서 36진수로 변환법]
36) 10000
36) 277... 28 -> S
7… 25 -> P
답) 10000(10) = 7PS(36)
36진수 -> 10진수
계산공식 : 10진수로 전개
예) [36진수에서 10진수로 변환법]
7PS(36) = (7*36^2)+(P*36^1)+(S*36^0)
= 7*36^2+25*36^1+(28*1)
= 9072 + 900 + 28
= 10000(10)
답) 7PS(36) = 10000(10)
[ 소스코드 ]
static string[] _36Index = new string[]{"0","1","2","3","4","5","6","7","8","9",
"A","B","C","D","E","F","G","H","I","J",
"K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"};
///
/// 10진수 ---> 36진수
///
///
///
private string oper10to36(int data)
{
string ret = "";
int _imsi = data;
if (data < 36)
{
ret = _36Index[data];
}
else
{
while (true)
{
int quotient = _imsi / 36;
int remainder = _imsi % 36;
ret = _36Index[remainder] + ret;
if (quotient < 36) { ret = _36Index[quotient] + ret; break; }
_imsi = quotient;
}
}
return ret;
}
///
/// 36진수 ----> 10진수
///
///
///
private double oper36to10(string data){
double ret = 0;
int _len = data.Length-1;
data = data.ToUpper();
for (int i=0; i<=_len; i++) {
ret += get36Index(System.Char.Parse(data.Substring(i, 1))) * (Math.Pow(36, (_len - i)));
}
return ret;
}
///
/// 인덱스 문자열
///
///
///
private int get36Index(char _val)
{
int ret = 0;
if (_val <= '9') { ret = _val - '0'; }
else { ret = _val - 'A' + 10; }
return ret;
}
private void operration()
{
int data_10 = 10000;
string val_36 = oper10to36(data_10);
Console.WriteLine("10진수:" + data_10 + ", 36진수 변환:" + val_36);
string data_36 = "7PS";
double val_10 = oper36to10(data_36);
Console.WriteLine("36진수:" + data_36 + ", 10진수 변환:" + val_10);
}
원리만 알면 자기가 원하는 진법으로 마음대로 변환할 수 있다.
36으로 나누는 대신 2, 8, 10, 16을 넣으면 2진수, 8진수, 10진수, 16진수가 됩니다.
조금만 손보면 36진법용이 아닌 모든 진법용 프로그램이 되겠죠.
.Net 2.0 원격 DB 디버깅 (0) | 2008.04.04 |
---|---|
C#으로 Transactional Object에 Object Pooling을 사용하도록 구성하기 (0) | 2008.04.01 |
Provider Infomation - SQL 수행 내용 확인 방법 (0) | 2008.04.01 |
비스타에서 설치 프로젝트 권한상승 하기 (0) | 2008.04.01 |
DllImport Attribute (0) | 2008.04.01 |