日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

任意进制转换算法

發布時間:2024/4/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 任意进制转换算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
任意進制轉換算法

N年沒有寫博客,發個進制轉換的玩下,支持負數;功能屬于簡化版的 Convert.ToInt32 ,特點是:

1、任意位,如:0,1(二進制),0...7(八進制),0...9,A...F(16進制),0...N(N進制),或者是:!@#$%^&*(8進制,字符符號),也可以是中文。

2、8 位最大長度。

3、C#源碼。

最近寫markdown格式習慣啦,cnblogs啥時候全改掉算了,別用這個htmleditor算了。

先說明下進制轉換的基礎知識,不會的可以了解下,會的就別看了,后面的也別看,純粹屬于浪費時間。

?

十六進制轉十進制表10 15 1 <-------------------------------------------------------------------- 0 0 0 0 0 A F 1 <-------------------------------------------------------------------- 16^7 16^6 16^5 16^4 16^3 16^2 16^1 16^0 268435456 16777216 1048576 65536 4096 256 16 1 <--------------------------------------------------------------------(10*256) + (15*16) + (1*1)=2560+240+1=2801

  

十進制轉十六進制表^ 19%16=3 | 0x3 19/16=1 | 0x1= 0x13H

?

十六進制到二進制快速轉換<-----------------------2^3 2^2 2^1 2^08 4 2 1<-----------------------0xF821 = 1111 1000 0010 0001<-----------------------0xF = 15= 8 + 4 + 2 + 1= 1 1 1 10x8 = 8= 8 + 0 + 0 + 0= 1 0 0 00x2 = 2= 0 + 0 + 2 + 0= 0 0 1 00x1 = 1= 0 + 0 + 0 + 1= 0 0 0 1

?

二進制到十六進制快速轉換<-----------------------2^3 2^2 2^1 2^08 4 2 1<-----------------------1111 1000 0010 0001 = 0xF821<-----------------------1111 = 8 + 4 + 2 + 1= 15= 0xF1000 = 8 + 0 + 0 + 0= 8= 0x80010 = 0 + 0 + 2 + 0= 2= 0x20001 = 0 + 0 + 0 + 1= 1= 0x1

?

十進制快速轉換十六進制103 = (6 * 16) + 7 = 0x6722 = (1 * 16) + 6 = 0x1654 = (3 * 16) + 6 = 0x36255 = (15* 16) + 15 = 0xff999 = (62 * 16) + 7 ~ 0x762= (3 * 16) + 14 ~ 0xe= 3 ~ 0x3= 0x3e79999= (624 * 16) + 15 ~ 0xF624= (39*16) + 0 ~ 0x039= (2* 16) + 7 ~ 0x72= 2 ~ 0x2= 0x270f1980= (123 * 16) + 12 ~ 0xc123= (7 * 16) + 11 ~ 0xb7= 7 ~ 0x7= 0x7bc

?

計算過程擺完了,下面是測試代碼(代碼未經優化,純屬測試):

class MainClass{public static void Main (string[] args){var nt = -3212;var ct = "";ct = ConvertToAny (nt, 0, "a,b,c");Console.WriteLine (ct);var rt = AnyToNumber (ct, "a,b,c");Console.WriteLine (rt);Console.WriteLine (Convert.ToString(nt,2));Console.ReadLine ();Console.WriteLine ("Test begin");for (int n = -1230; n < 1230; n++) {var a = n.ToString ("X");var b = ConvertToAny (n, 0, "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F");if (a != b) {Console.WriteLine ("[{2}]Error:a!=b: {0} {1}", a, b, n);} else if (n % 100 == 0) {Console.WriteLine ("[{2}]Curr: a!=b: {0} {1} OK", a, b, n);}}Console.WriteLine ("Test ok");Console.WriteLine ("Test begin");for (int n = -1230; n < 1230; n++) {var hex = n.ToString ("X");var a = Convert.ToInt32 (hex, 16);var b = AnyToNumber (hex, "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F");if (a != b) {Console.WriteLine ("[{2}]Error:a!=b: {0} {1}", a, b, hex);} else if (n % 100 == 0) {Console.WriteLine ("[{2}]Curr: a!=b: {0} {1} OK", a, b, hex);}}Console.WriteLine ("Test ok");Console.WriteLine (ConvertToAny (int.MaxValue, 0, "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F"));}static bool isNegativeNumber(string any, string anyString ){var s = ConvertToAny (int.MaxValue, 0, anyString);if (s.Length != any.Length) {return false;} else {var ReverseTable = BuildReverseTable (anyString);if (ReverseTable [any [0].ToString ()] > ReverseTable [s [0].ToString ()]) {return true;}}return false;}static int AnyToNumber (string any, string anyString = "0,1,2,3,4,5,6,7,8,9"){int sum = 0;var ConversionTable = BuildConversionTable (anyString);var ReverseTable = BuildReverseTable (anyString);var tableBit = ConversionTable.Count;bool negativeNumber = false;var conversionPadSize = 0;conversionPadSize = 128 / tableBit;if (tableBit < 10) {conversionPadSize /= 2;}//是否負數if( isNegativeNumber( any, anyString) ){negativeNumber = true;//反轉var res = any;any = "";var moveBit = tableBit - 1;foreach (var c in res) {any += NumberConversion (ConversionTable, moveBit - FindConversion (ReverseTable, c.ToString ()));}}var cur = any.Length - 1;for (var n = 0; n < any.Length; n++,cur--) {var c = any [n].ToString ();var bitSum = FindConversion (ReverseTable, c) * (int)Math.Pow (tableBit, cur);sum += bitSum;}if (negativeNumber) {//補位sum++;sum = 0 - sum;}return sum;}static string ConvertToAny (int number, int padSize = 8, string anyString = "0,1,2,3,4,5,6,7,8,9"){var conversionPadSize = padSize;var ConversionTable = BuildConversionTable (anyString);var ReverseTable = BuildReverseTable (anyString);var tableBit = ConversionTable.Count;long input = Math.Abs ((long)number);//補碼if (number < 0) {input -= 1;conversionPadSize = 128 / tableBit;if (tableBit < 10) {conversionPadSize /= 2;}}var result = "";while (true) {if (input >= tableBit) {result = NumberConversion (ConversionTable, (int)(input % tableBit)) + result;input = (int)(input / tableBit);} else {result = NumberConversion (ConversionTable, (int)input) + result;break;}}if (result.Length < conversionPadSize) {//補位result = StringPadLeft (result, conversionPadSize, ConversionTable [0]);} else { // //對齊 // if (result.Length % 2 != 0) { // result = ConversionTable[0] + result; // } } if (number < 0) {//反轉var res = result;result = "";var moveBit = tableBit - 1;foreach (var c in res) {result += NumberConversion (ConversionTable, moveBit - FindConversion (ReverseTable, c.ToString ()));}}return result;}static string StringPadLeft (string src, int size, string c){var nsize = size - src.Length;for (var n = 0; n < nsize; n++) {src = c + src;}return src;}static string NumberConversion (Dictionary<int,string> table, int n){return table [n];}static int FindConversion (Dictionary<string,int> table, string c){return table [c];}static Dictionary<string,int> BuildReverseTable (string tableString){var table = tableString.Split (",".ToCharArray (), StringSplitOptions.RemoveEmptyEntries).ToList ();//補位操作,必須是2的倍數if (table.Count % 2 != 0) {table.Insert (0, "0");}var result = new Dictionary<string,int> ();for (var i = 0; i < table.Count; i++) {result.Add (table [i].ToString (), i);}return result;}static Dictionary<int,string> BuildConversionTable (string tableString){var table = tableString.Split (",".ToCharArray (), StringSplitOptions.RemoveEmptyEntries).ToList ();//補位操作,必須是2的倍數if (table.Count % 2 != 0) {table.Insert (0, "0");}var result = new Dictionary<int,string> ();for (var i = 0; i < table.Count; i++) {result.Add (i, table [i].ToString ());}return result;}}

?

有趣的測試:

轉換結果

?

代碼未經測試,自己可以完善

轉載于:https://www.cnblogs.com/Chinasf/p/5547968.html

總結

以上是生活随笔為你收集整理的任意进制转换算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩r级在线观看 | 96视频在线 | 在线看片一区二区 | 国产高清免费av | 午夜在线观看视频18 | 四川话毛片少妇免费看 | 日韩精品偷拍 | 亚洲视频天天射 | 99精品网站 | 中文字幕永久在线观看 | 成人精品在线观看视频 | 免费国产小视频 | 黑人巨大猛交丰满少妇 | 欧美中文字幕在线观看 | 天天看天天操 | 国产精品videossex久久发布 | xzjzjzjzjzj欧美大片 | 成人免费av | 天天天天天干 | 日韩黄色片子 | 爽好多水快深点欧美视频 | 人人爽人人| 日批视屏 | 黄色一极视频 | 日本高清不卡一区 | 精品久久五月天 | 日韩一区二区精品视频 | 黄色日韩在线 | 天天做天天爱天天爽综合网 | 欧美在线观看网站 | 国产又猛又粗 | 亚洲电影在线看 | 久久资源365 | 日本va欧美va精品发布 | 日本午夜激情 | 亚洲精选久久 | 久久久久久久久久福利 | 国产综合视频在线观看 | www久久久久久久 | 久久综合鬼色 | 校园春色 亚洲色图 | 国产精品99久久久久久宅男 | 日韩一区二区三区精品 | 俄罗斯厕所偷拍 | 80日本xxxxxxxxx96 亚洲国产精品视频在线 | 99久久夜色精品国产亚洲 | 亚洲宗人网| 中文字幕一区二区三区手机版 | 深爱五月激情五月 | 无码免费一区二区三区 | 黄床大片 | 日韩久久久久久久久 | 超碰超碰超碰超碰超碰 | 国产人人爱 | 亚洲欧美自拍偷拍 | 国产成人精品综合久久久久99 | 国产欧美一区二区三区沐欲 | 午夜黄色影院 | 欧美国产综合视频 | wwwxxx在线| 中文字幕麻豆 | 亚洲综合日韩精品欧美综合区 | 国产又黄又粗又长 | 主人性调教le百合sm | 中文字幕福利 | 在线国产福利 | 免费的黄色大片 | 欧美乱论| 男人天堂b| 欧美精品日韩在线观看 | 欧美激情校园春色 | 亚洲精品少妇一区二区 | 午夜电影一区 | 小仙女av | 中文字幕xxx | 欧美一级鲁丝片 | 国产av无码专区亚洲av毛片搜 | 翔田千里一区二区三区av | 天堂久久久久久 | 亚洲精品大全 | 久久er99热精品一区二区 | 久久成人国产精品 | 人妻在线一区 | 内裤摩擦1v1h | 日韩影视一区 | 国产粉嫩av | 国产熟妇另类久久久久 | 中国少妇初尝黑人巨大 | 四虎国产精品永久免费观看视频 | 亚洲另类一区二区 | 在线香蕉视频 | 成人免费视频国产在线观看 | 中文字幕一区二区人妻在线不卡 | 成年黄色片 | 欧美天天射 | 国产又大又硬又粗 | 四虎影院永久地址 | 欧美日韩偷拍视频 | 男女免费毛片 |