首页 > 编程语言 >C#(进制转换) NumberConversion

C#(进制转换) NumberConversion

时间:2023-02-08 11:45:52浏览次数:50  
标签:进制 C# number decimalNumber destinationSystem NumberConversion baseSystem string

封装进制和进制之间的转换(算法)

C# 进制转换(二进制、十六进制、十进制互转)

 public class NumberConversion
    {
        private static readonly char[] alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

        public static string Convert(uint baseSystem, uint destinationSystem, string number) =>
            Convert(System.Convert.ToInt32(baseSystem), System.Convert.ToInt32(destinationSystem), number);
        private static string Convert(int baseSystem, int destinationSystem, string number)
        {
            if (baseSystem == 0 || destinationSystem == 0)
                throw new ArgumentException("Number System connot be zero");
            if (number == "0")
                return "0";
            if (baseSystem == destinationSystem)
                return number.ToString();

            long decimalNumber;
            if (baseSystem != 10)
                decimalNumber = ConvertToDecimal(baseSystem, number);
            else
                decimalNumber = System.Convert.ToInt32(number);

            if (destinationSystem != 10)
                return ConvertFromDecimalToAny(decimalNumber, destinationSystem);
            else
                return decimalNumber.ToString();
        }

        private static long ConvertToDecimal(int baseSystem, string number)
        {
            string numbers = number.ToString();
            long[] heavyNumbers = new long[numbers.Length];

            int i = 0;
            int p = numbers.Length - 1;

            while (i < numbers.Length)
            {
                heavyNumbers[i] = System.Convert.ToInt64(Math.Pow(baseSystem, p)) * System.Convert.ToInt64(numbers[i].ToString());

                i++;
                p--;
            }

            long decimalNumber = 0;
            for (int s = 0; s < heavyNumbers.Length; s++)
            {
                decimalNumber += heavyNumbers[s];
            }

            return decimalNumber;
        }

        private static string ConvertFromDecimalToAny(long decimalNumber, int destinationSystem)
        {
            List<long> rest = new List<long>();
            while (decimalNumber != 0)
            {
                rest.Add(decimalNumber % destinationSystem);
                decimalNumber = decimalNumber / destinationSystem;
            }

            string[] results = new string[rest.Count];
            for (int i = 0; i < rest.Count; i++)
            {
                if (rest[i] >= 10)
                {
                    results[i] = alpha[rest[i] - 10].ToString();
                }
                else
                {
                    results[i] = rest[i].ToString();
                }
            }

            string result = "";
            for (int i = rest.Count - 1; i >= 0; i--)
            {
                result += results[i];
            }

            return result;
        }
    }

 

 static void Main(string[] args)
        {
        //10  进制转  34 进制
            Console.WriteLine(NumberConversion.Convert(10, 34, "19366"));

        }

 

 

在进行进制数直接转换时,`ToString`、`ToInt32`中要转换成的进制数参数要明确,大多是转成几进制,就直接在参数中填写几进制(其中二进制转十进制、二进制转16进制除外)。

二进制(字符串)转换为十进制的结果为32位有符号整数,转换进数为2;

二进制(字符串)转换为十六进制的结果为整型,为了将其表示成十六进制,还需要借助`string.Format("{0:x}", 转换的二进制数)`将其表示为十六进制,转换进数为2;

十进制(整型)转二进制的结果为字符串,转换进数为2;

十进制(整型)转十六进制的结果为字符串,转换进数为16;

十六进制(整型)转二进制的结果为字符串,转换进数为2;

十六进制(整型)转十进制的结果为字符串,转换进数为10。

总的来说,在进行进制转换时,二进制必须为字符串作为转换参数。

 

标签:进制,C#,number,decimalNumber,destinationSystem,NumberConversion,baseSystem,string
From: https://www.cnblogs.com/yijieyufu/p/17101142.html

相关文章

  • Leetcode打卡记录
    23.2.8189.轮转数组解题思路1:用pythonlist的切片特性,再组合成新的字符串。——失败,未使用原地算法,判定不通过解题思路2(评论区):通过多次翻转,实现右移。1.反转整......
  • 移动云 云电脑 配置跑分 4C8G 80G系统盘 50M带宽 0G数据盘
    4核HygonC86728532-coreProcessor据查为国产CPU海光  CPU-Zx32跑分 有点太差了吧。。。多核才257,我这8250U还764分呢 x64跑分  8250U1561分 ......
  • 【OpenCV】- 直方图反向投影
    文章目录​​1引言​​​​2反向投影的工作原理​​​​3反向投影的作用​​​​4反向投影的结果​​​​5计算反向投影:calcBackProject()函数​​​​6通道复制:mixCh......
  • docker搭建yapi接口文档系统、Idea中上传接口、在线调用
    一、前言在我们后端开发中,必不可少的是接口的交接,有很多种方式,常见的就是swagger,不过这个侵入性太强了。还有就是接口文档的框架,比如今天小编带大家一起搭建的yapi,在公司......
  • ThreadLocal: 线程独享
    ThreadLocal线程局部变量ThreadLocal是使用空间换时间,synchronized是使用时间换空间比如在hibernate中session就存在与ThreadLocal中,避免synchronized的使用packagecom.mo;......
  • ArcGIS栅格裁剪后色彩变化处理
    一、两种裁剪方式:1、按掩膜提取  2、栅格裁剪  二、色彩调整1、原栅格另存拉伸的xml文件  2、裁剪后的栅格加载xml文件 ......
  • Linux编写C/C++程序
    ​1、安装gcc、g++编译器1.切换root用户suroot然后输入密码2.输入命令yuminstallgccyuminstallg++3.通过查找路径来检查安装是否完成whichgccw......
  • 欧盟玩具CE认证EN71测试
    CE认证:CE标示(CEMarking)是产品进入欧盟境内销售的通行证。欧盟为了保障其会员国内人民生命与财产安全,规定出许多需要粘贴CE标志的产品,如机械、低电压电气产品、电磁兼容性......
  • 2023-02-08 记录一下react-native app项目搭建过程
    项目开发环境:windows10项目运行系统:Android项目搭建前你得确保你有一个用于开发的IDE和已经安装好了的rn(react-native简称)脚手架,我是要用rn的脚手架来搭建项目的。请分......
  • DHCPv6-Solicit-XID
    No.TimeSourceDestinationProtocolInfo40.092161fe80::f8ae:aae:ee9a:bdc0ff02::1:2DHCPv6SolicitXID:0x11de5dCID:000100012a4da59......