亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

自己實現各種進制相互轉換

2019-11-14 14:04:23
字體:
來源:轉載
供稿:網友

本文自己實現了2、8、10、16進制數的相互轉換。實際中很少用到或者直接用api,所以大神老鳥請繞行。

有興趣的朋友也可以自己先寫寫,當做練習,僅此而已。

ok, 直接進入主題。先說一下各進制轉換的算法(百度一下也ok的)。

 

算法:

一、10 進制數是平時所用到的,先從它開始。10進制轉換為其它進制的數,用到的是【輾轉相除取余法】。簡單的說,就是該數一直除以進制數(例如2進制就除以2),然后取余數,一直到結果為0。依次由下往上取余數就是結果。

例如:5(10進制),轉換為2進制,進行上述過程,得到的余數分別是:1、0、1, 那么結果就是:101(二進制)。對于 8和16進制,也是同樣的過程。需要注意的是,對于16進制,10-15 分別表示為:A-E。

二、非10進制轉換為10進制數。用到的是【位乘法】(名稱是亂起的,只是為了與除法相對)。簡單的說,公式就是:i * base^(j-1),i: 第j位上的數, base:進制  j: 第j位。例如:101(2進制),運用公式后就是:1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 5(十進制)。

三、其它進制的相互轉換。既然有了10進制這個“中間人”,其它的轉換只要通過這個中間人就可以了。實際上轉換的過程也很簡單,例如8進制轉2進制,就是“一分為三”;16進制轉2進制,就是“一分為四”;相反的過程就是“三位合一”、“四位合一”。

需要注意的是:上述計算過程都是針對整數部分,如果是小數部分,計算就不一樣了。

現在我們來看看小數部分的計算。

對于一、小數部分的計算是:小數部分 * base 取整數,小數部分再繼續 * base,再得到整數... 一直到小數部分為0。例如10進制數:0.5,轉為8進制是:

0.5 * 8 = 4.0 ; 也就是:4。

對于二、小數部分的計算是:i * base^(-j)。 例如2進制數,0.11,小數部分的計算是:1 * 2^(-1) + 1 * 2^(-2)。

 so,上面就是基本的轉換過程,文字表達起來肯定沒那么清晰,有興趣的朋友可以百度,圖文并茂,更好理解。

 

實現:

我們先來看一下利用.net提供的功能是如何實現的,很簡單,就2行代碼,如下:

static string SystemConvertUseAPI(string value, int from, int to){    int temp = Convert.ToInt32(value, from);    return Convert.ToString(temp, to);}

不過Convert自帶的轉換有一個缺點,就是無法計算小數和負數,.net3.5 下測試的,不知道高版本的可不可以。

下面是我自己的實現過程,(核心部分就是與10進制的相互轉換),如下:

    public static class SystemConvert    {        public static string ConvertValue(string value, int from, int to)        {            EnsureArguments(value, from, to);            char c = value[0];            string[] values = GetValues(value);            string result = string.Empty;            if (from == 10)                result = TenToOthers(values, to);            else if (to == 10)                result = OthersToTen(values, from);            else                result = OthersToOthers(values, from, to);            return c == '-' ? c.ToString() + result : result;        }        /// <summary>        /// 檢查參數        /// </summary>        /// <param name="value"></param>        /// <param name="from"></param>        /// <param name="to"></param>        PRivate static void EnsureArguments(string value, int from, int to)        {            if (value == null || value.Trim() == string.Empty)                throw new ArgumentNullException("value");            if (!(from == 10 || from == 2 || from == 8 || from == 16))                throw new ArgumentException("from 指定的基數不正確!");            if (!(to == 10 || to == 2 || to == 8 || to == 16))                throw new ArgumentException("to 指定的基數不正確!");            string pattern = string.Empty;            Regex regex = null;            if (from == 2)                pattern = @"^(/-|/+?)[01]+(.{0,1}[01]+)?$";            else if (from == 8)                pattern = @"^(/-|/+?)[01234567]+(.{0,1}[01234567]+)?$";            else if (from == 10)                pattern = @"^(/-|/+?)[0123456789]+(.{0,1}[0123456789]+)?$";            else                pattern = @"^(/-|/+?)[0123456789|abcdef|ABCDEF]+(.{0,1}[0123456789|abcdef|ABCDEF]+)?$";            regex = new Regex(pattern);            if (!regex.IsMatch(value))                throw new ArgumentException("源字符串不符合" + from.ToString() + "進制規范");        }        /// <summary>        /// 拆分字符串        /// </summary>        /// <param name="value"></param>        /// <returns></returns>        private static string[] GetValues(string value)        {            value = value.Trim(new char[] { '+', '-', '0', '.' });            return value.Split(new char[] { '.' });        }        private static int Format16Char2Number(string c)        {            switch (c.ToUpper())            {                case "A":                    return 10;                case "B":                    return 11;                case "C":                    return 12;                case "D":                    return 13;                case "E":                    return 14;                case "F":                    return 15;                default:                    return Convert.ToInt32(c);            }        }        private static string Format16Number2Char(int number)        {            switch (number)            {                case 10:                    return "A";                case 11:                    return "B";                case 12:                    return "C";                case 13:                    return "D";                case 14:                    return "E";                case 15:                    return "F";                default:                    return number.ToString();            }        }        /// <summary>        /// 其它進制轉換為10進制(位乘法)        /// </summary>        /// <param name="value"></param>        /// <param name="from"></param>        /// <returns></returns>        private static string OthersToTen(string[] values, int from)        {            string result = string.Empty;            string integer = values[0];            string temp = string.Empty;            int integerCurrent = 0;            int integerResult = 0;            int index = integer.Length - 1;            bool is16 = from == 16;            foreach (var c in integer)            {                temp = c.ToString();                integerCurrent = is16 ? Format16Char2Number(temp) : Convert.ToInt32(temp);                integerResult += integerCurrent * (int)Math.Pow((double)from, (double)index);                index--;            }            if (values.Length <= 1)            {                return integerResult.ToString();            }            else            {                string decimaler = values[1];                double decimalerCurrent = 0.0;                double decimalerResult = 0.0;                index = -1;                foreach (var c in decimaler)                {                    temp = c.ToString();                    decimalerCurrent = is16 ? Format16Char2Number(temp) : Convert.ToDouble(temp);                    decimalerResult += decimalerCurrent * Math.Pow((from), (double)index);                    index--;                }                return (integerResult + decimalerResult).ToString();            }        }        /// <summary>        /// 10進制轉換為其它進制(輾轉相除法)        /// </summary>        /// <param name="values"></param>        /// <param name="to"></param>        /// <returns></returns>        private static string TenToOthers(string[] values, int to)        {            int integerCurrent = Convert.ToInt32(values[0]);            int remainder = 1;            bool is16 = to == 16;            string integerResult = string.Empty;            while (integerCurrent > 0)            {                remainder = integerCurrent % to;                integerResult = (is16 ? Format16Number2Char(remainder) : remainder.ToString()) + integerResult;                integerCurrent = integerCurrent / to;            }            if (values.Length <= 1)            {                return integerResult;            }            else            {                double decimalerCurrent = Convert.ToInt32(values[1]) / Math.Pow(10.0, (double)values[1].Length);                int decimalerInt = 0;                double decimalerDec = decimalerCurrent;                string decimalerResult = string.Empty;                string[] strArr;                while (decimalerDec != 0)                {                    decimalerCurrent = decimalerDec * to;                    //拆分double,得到整數和小數部分                    strArr = decimalerCurrent.ToString().Split(new char[] { '.' });                    decimalerInt = Convert.ToInt32(strArr[0]);                    if (strArr.Length > 1)                        decimalerDec = Convert.ToDouble(strArr[1]) / (Math.Pow(10.0, (double)strArr[1].Length));                    else                        decimalerDec = 0;                    decimalerResult += is16 ? Format16Number2Char(decimalerInt) : decimalerInt.ToString();                    //這里默認精確到32位,可以加個參數指定                    if (decimalerResult.Length > 32)                        break;                }                return integerResult + "." + decimalerResult;            }        }        /// <summary>        /// 其它進制互轉。以10進制為中間值即可        /// </summary>        /// <param name="values"></param>        /// <param name="from"></param>        /// <param name="to"></param>        /// <returns></returns>        private static string OthersToOthers(string[] values, int from, int to)        {            string to10 = OthersToTen(values, from);            values = to10.Split(new char[] { '.' });            return TenToOthers(values, to);        }    }

順帶一句,【程序設計】,個人覺得最重要的是“設計”二字。在寫代碼前,我們需要理清邏輯,想好實現的過程;當設計好了,代碼寫起來會更快、bug 也會更少,測試起來也更容易。所以,碰到一個問題或需求,切記不要馬上就敲代碼。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美久久久精品| 亚洲理论片在线观看| 成人黄色av网站| 国产69久久精品成人看| 久久久精品亚洲| 欧美性猛交xxxx乱大交3| 精品动漫一区二区三区| x99av成人免费| 欧美在线观看日本一区| 欧美又大又粗又长| 欧美日韩第一视频| 欧美日韩国产va另类| 日韩美女视频中文字幕| 91久久在线播放| 国产成人精品最新| 日韩美女在线播放| 欧美极品在线视频| 91精品视频在线看| 日韩a**中文字幕| 久久精品一本久久99精品| 色噜噜亚洲精品中文字幕| 国产日产久久高清欧美一区| 97碰在线观看| 亚洲欧洲一区二区三区在线观看| 亚洲视频综合网| 日韩在线免费视频| 18性欧美xxxⅹ性满足| 日韩av影院在线观看| 久久国产精彩视频| 久久69精品久久久久久久电影好| 亚洲人午夜精品| 午夜伦理精品一区| 久久久免费精品视频| 国产亚洲一区精品| 国产精品久久久亚洲| 国产精品老女人视频| 视频在线观看99| 久久午夜a级毛片| 欧美综合激情网| 亚洲va码欧洲m码| 欧美一区二区大胆人体摄影专业网站| 久热精品视频在线免费观看| 国产亚洲精品久久| 日韩成人小视频| 免费不卡在线观看av| 亚洲欧美国产日韩中文字幕| 2019中文字幕在线| 亚洲激情视频在线观看| 少妇高潮久久77777| 日韩av毛片网| 欧美激情一区二区三级高清视频| 亚洲欧美综合精品久久成人| 欧美极品欧美精品欧美视频| 国产这里只有精品| 欧美一级电影免费在线观看| 日韩精品在线免费| 欧美大胆a视频| 在线播放日韩精品| 亚洲爱爱爱爱爱| 欧美自拍大量在线观看| 色综合91久久精品中文字幕| 国产欧美日韩丝袜精品一区| 国产在线精品一区免费香蕉| 久久国产精品电影| 91欧美精品成人综合在线观看| 久久九九亚洲综合| 亚洲精品自拍偷拍| 97超级碰在线看视频免费在线看| 国产999在线| 国产精品欧美日韩一区二区| 国产婷婷97碰碰久久人人蜜臀| 国产精品观看在线亚洲人成网| 亚洲国产精品久久久久久| 亚洲人成电影在线观看天堂色| 神马久久久久久| 亚洲人a成www在线影院| 国产精品久久久久91| 欧美日韩在线免费观看| 美女少妇精品视频| 国产精品美女午夜av| 欧美在线不卡区| 久久亚洲精品小早川怜子66| 欧美激情图片区| 欧美电影免费观看高清| 97国产精品人人爽人人做| 日本精品视频在线观看| 国产日韩精品一区二区| 日本国产高清不卡| 国产欧美在线观看| 在线视频中文亚洲| 亚洲精品综合久久中文字幕| 亚洲一区二区三区四区在线播放| 九九热99久久久国产盗摄| 91精品视频观看| 欧美国产视频一区二区| 成人欧美一区二区三区黑人| 日韩视频在线免费观看| 欧美高清视频在线| 久久精视频免费在线久久完整在线看| 欧美视频二区36p| 一区二区三区 在线观看视| 精品国产一区av| 亚洲精品456在线播放狼人| 欧美日韩国产色| 国产精品18久久久久久首页狼| 少妇av一区二区三区| 国产精品va在线播放我和闺蜜| 亚洲人成在线电影| 疯狂蹂躏欧美一区二区精品| 日韩高清电影好看的电视剧电影| 91亚洲一区精品| 日韩精品极品毛片系列视频| 日韩av电影手机在线| 中文字幕日本欧美| 日韩国产在线播放| 精品日韩视频在线观看| 欧美电影免费观看高清完整| 欧美激情国内偷拍| 美女久久久久久久久久久| 高清欧美电影在线| 91精品久久久久久久久中文字幕| 亚洲国产古装精品网站| 欧美日韩亚洲网| 亚洲在线观看视频网站| 一级做a爰片久久毛片美女图片| 亚洲aⅴ男人的天堂在线观看| 911国产网站尤物在线观看| 亚洲国产欧美一区二区丝袜黑人| 亚洲欧美成人一区二区在线电影| 久久久噜噜噜久噜久久| 欧美日韩福利电影| 国产日韩欧美视频| 亚洲国产精品va在看黑人| 色综久久综合桃花网| 6080yy精品一区二区三区| 成人网页在线免费观看| 欧美肥婆姓交大片| 91日本在线观看| 亚洲最大激情中文字幕| 精品久久香蕉国产线看观看gif| 亚洲精品日韩久久久| 久久夜精品香蕉| 日韩最新av在线| 国产精品第一第二| 日韩欧美中文第一页| 久久久精品国产亚洲| 免费97视频在线精品国自产拍| 成人性教育视频在线观看| 亚洲欧洲午夜一线一品| 日韩美女在线观看一区| 国产精品久久电影观看| 国产www精品| 久久影院模特热| 91成品人片a无限观看| 久久久久久久久中文字幕| 川上优av一区二区线观看| 亚洲999一在线观看www| 国产欧美精品一区二区三区介绍| 日韩av123| 日韩欧美在线看| 一本色道久久综合狠狠躁篇的优点| 亚洲成人网在线| 九色精品免费永久在线| 亚洲国产女人aaa毛片在线|