상세 컨텐츠

본문 제목

진법변환

C#

by 탑~! 2008. 4. 1. 10:21

본문

[진법변환 원리]

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진법용이 아닌 모든 진법용 프로그램이 되겠죠.

관련글 더보기