dev/asp.net, c#

[c#] 10진수를 X진수 또는 X진수를 10진수 변환 하기(X to Y 진수 변환), 2진수, 8진수, 16진수 진법 변환

코딩for 2022. 11. 25. 11:34
반응형

 

진법의 의미

진법이란 몇 개의 기본 숫자를 이용하여 수를 표시하는 방법으로 자릿값이 올라감에 따라 수가 일정하게 커지는 규칙을 이용하여 수를 표시하는 것을 말한다. 오늘날에는 인도-아라비아 숫자를 사용하므로 0부터 9까지의 기본 숫자 또는 이 숫자 중 일부를 이용한 십진법, 이진법, 오진법 등으로 수를 표시한다.

10진수를 X진수로 변환

바꾸고 싶은 진수의 숫자로 더 이상 나눌 수 없을 때까지 나눈 뒤 몫과 나머지를 역순으로 읽는다.

 

그림과 같이 12를 3진법으로 변환한다하면 12를 3으로 나누기를 하면서 목을 나눌수 없을때까지 반복후

몫과 나머지를 화살표 방향처럼 읽어주면 해당 진법으로 변환된 수가 된다.

 C# 으로 구현해본 10진수를 X진수로 변환 코드보기

 

더보기
public string Convert10ToX(int num, int arithmetic)
{
    int number = num;
    string result = "";

    while (true)
    {
        var quotient = num / arithmetic;      // 몺
        var remainder = num % arithmetic;      // 나머지 

        num = quotient; // 몫을 다시 계산하기 위해서 값에 넣는다.

        string value = "";
        if (arithmetic > 10)
        {
            if (remainder == 10) value = "a";
            else if (remainder == 11) value = "b";
            else if (remainder == 12) value = "c";
            else if (remainder == 13) value = "d";
            else if (remainder == 14) value = "e";
            else if (remainder == 15) value = "f";
            else if (remainder == 16) value = "g";
            else if (remainder == 17) value = "h";
            else if (remainder == 18) value = "i";
            else if (remainder == 19) value = "j";
            else if (remainder == 20) value = "k";
            else if (remainder == 21) value = "l";
            else if (remainder == 22) value = "m";
            else if (remainder == 23) value = "n";
            else if (remainder == 24) value = "o";
            else if (remainder == 25) value = "p";
            else if (remainder == 26) value = "q";
            else if (remainder == 27) value = "r";
            else if (remainder == 28) value = "s";
            else if (remainder == 29) value = "t";
            else if (remainder == 30) value = "u";
            else if (remainder == 31) value = "v";
            else if (remainder == 32) value = "w";
            else if (remainder == 33) value = "x";
            else if (remainder == 34) value = "y";
            else if (remainder == 35) value = "z";
            else
            {
                value = remainder.ToString();
            }
        }
        else
        {
            value = remainder.ToString();
        }

        result += value;

        if (num < arithmetic)
        {
            string value2 = "";

            if (quotient == 10) value2 = "a";
            else if (quotient == 11) value2 = "b";
            else if (quotient == 12) value2 = "c";
            else if (quotient == 13) value2 = "d";
            else if (quotient == 14) value2 = "e";
            else if (quotient == 15) value2 = "f";
            else if (quotient == 16) value2 = "g";
            else if (quotient == 17) value2 = "h";
            else if (quotient == 18) value2 = "i";
            else if (quotient == 19) value2 = "j";
            else if (quotient == 20) value2 = "k";
            else if (quotient == 21) value2 = "l";
            else if (quotient == 22) value2 = "m";
            else if (quotient == 23) value2 = "n";
            else if (quotient == 24) value2 = "o";
            else if (quotient == 25) value2 = "p";
            else if (quotient == 26) value2 = "q";
            else if (quotient == 27) value2 = "r";
            else if (quotient == 28) value2 = "s";
            else if (quotient == 29) value2 = "t";
            else if (quotient == 30) value2 = "u";
            else if (quotient == 31) value2 = "v";
            else if (quotient == 32) value2 = "w";
            else if (quotient == 33) value2 = "x";
            else if (quotient == 34) value2 = "y";
            else if (quotient == 35) value2 = "z";
            else
            {
                value2 = quotient.ToString();
            }

            result += value2.ToString();

            break;
        }
    }


    var answer = string.Join("", result.Reverse());
    Console.WriteLine($"{number}의 {arithmetic}진수 값은 : {answer}");

    return answer;
}

* 10진수 이상 부터는 a~z 까지의 알파벳으로 표현

* 알파벳으로 표현가능한 36진수까지 가능

 

 

X진수를 10진수로 변환

 

변환하려는 진수의 자리값과 진수의 자릿수에따른 지승을 곱한값을 더한다.

C# 으로 구현해본 X진수를 10진수로 변환 코드보기

더보기
public  int ConvertXTo10(string number, int arithmetic)
{
    int answer = 0;
    var idx = number.Length;

    for (var i = 0; i < number.Length; i++)
    {
        var pow = (int)Math.Pow(arithmetic, --idx);	// 지승값을 구하기
        string num = number[i].ToString().ToLower();

        if (number[i] == 'a') num = "10";
        else if (number[i] == 'b') num = "11";
        else if (number[i] == 'c') num = "12";
        else if (number[i] == 'd') num = "13";
        else if (number[i] == 'e') num = "14";
        else if (number[i] == 'f') num = "15";
        else if (number[i] == 'g') num = "16";
        else if (number[i] == 'h') num = "17";
        else if (number[i] == 'i') num = "18";
        else if (number[i] == 'j') num = "19";
        else if (number[i] == 'k') num = "20";
        else if (number[i] == 'l') num = "21";
        else if (number[i] == 'm') num = "22";
        else if (number[i] == 'n') num = "23";
        else if (number[i] == 'o') num = "24";
        else if (number[i] == 'p') num = "25";
        else if (number[i] == 'q') num = "26";
        else if (number[i] == 'r') num = "27";
        else if (number[i] == 's') num = "28";
        else if (number[i] == 't') num = "29";
        else if (number[i] == 'u') num = "30";
        else if (number[i] == 'v') num = "31";
        else if (number[i] == 'w') num = "32";
        else if (number[i] == 'x') num = "33";
        else if (number[i] == 'y') num = "34";
        else if (number[i] == 'z') num = "35";

        answer += Convert.ToInt32(num) * pow;	// 자릿수값 x 지승값 이 구하는 해 10진수
    }

    Console.WriteLine($"{arithmetic}진수 {number}의 10진수 값은 : {answer}");

    return answer;
}

 

 

X진수를 Y진수로 변환

 

위 2가지 진법 변환과 같이 3진법 110를 을 5진법으로 변환한다면 

첫번째,  3진법을  10진법으로 변환 한다. (3진수 110은 10진수 12)

다시 변환된 10진수 12를 가지고 5진법으로 변환한다. (10진수 12의 5진수는 22)

 

 

참고로, c#에서는 2,8,16 진수 변환은 메소드를 통해서 간단히 변환할수 있다.

  • Convert.ToString(변환값, 진법);  10진수를 2,8,16진수 로 변환 
  • Convert.ToInt32(변환값, 진법);  2,8,16진수를 10진수로 변환
int value = 11;
Console.WriteLine("진수 변환 : " + value);
Console.WriteLine("10진수 -> 2진수 : " + Convert.ToString(value, 2)); 
Console.WriteLine("2진수 -> 10진수 : " + Convert.ToInt32(Convert.ToString(value, 2), 2));

Console.WriteLine("10진수 -> 8진수 : " + Convert.ToString(value, 8));
Console.WriteLine("8진수 -> 10진수 : " + Convert.ToInt32(Convert.ToString(value, 8), 8));

Console.WriteLine("10진수 -> 16진수 : " + Convert.ToString(value, 16));
Console.WriteLine("16진수 -> 10진수 : " + Convert.ToInt32(Convert.ToString(value, 16), 16));

 

반응형