【问题标题】:How to converting a string of Binary numbers into a string of Decimal numbers?如何将一串二进制数转换为一串十进制数?
【发布时间】:2019-01-08 12:41:46
【问题描述】:

我想做一个程序,将二进制字符串转换为十进制字符串。 我知道你是怎么做到的:

Convert.ToString(00001000, 2);

要将单个二进制数转换为单个十进制数,但是如何在字符串中取一堆二进制数,如下所示:

00001000 00000101 00001100 00001100 00001111
00010111 00001111 00010010 00001100 00000100

变成一串十进制数,像这样:

8 5 12 12 15
23 15 18 12 4

【问题讨论】:

    标签: c# binary decimal


    【解决方案1】:

    就像Convert.ToInt32一样简单

    将指定基数中数字的字符串表示形式转换为 一个等效的 32 位有符号整数。

    int output = Convert.ToInt32(input, 2);
    

    如果它在一个以空格分隔的列表中,只需使用string.Split

    返回一个字符串数组,其中包含此实例中的子字符串 由指定字符串或 Unicode 的元素分隔的 字符数组。

    var input = "00001000 00000101 00001100 00001100 00001111";
    
    var results = input.Split(' ')
                       .Select(x => Convert.ToInt32(x, 2))
                       .ToList();
    
    Console.WriteLine(string.Join(",",results))
    

    输出

    8,5,12,12,15
    

    Full Demo Here


    对于那些在家玩的人来说,这是一种将二进制字符串转换为 int 的荒谬方法,完全无视字节序

    注意:规模只是预期的项目数,可以很容易地用 List.Add() 替换,成本很低

    [Test("BitShift", "", false)]
    public unsafe List<int> Convert(string input, int scale)
    {
    
       var list = new int[scale];
    
       fixed (int* plist = list)
       fixed (char* pInput = input)
       {
          var pLen = pInput + input.Length;
          var val = 0;
          var pl = plist;
          for (var p = pInput; p < pLen; p++)
             if (*p != ' ')
                val = (val << 1) + (*p - 48);
             else
             {
                *pl = val;
                pl++;
                val = 0;
             }
          *pl = val;
       }
    
       return list.ToList();
    }
    

    基准测试

    这里有一些基准供您欣赏

    ----------------------------------------------------------------------------
    Mode             : Release (64Bit)
    Test Framework   : .NET Framework 4.7.1 (CLR 4.0.30319.42000)
    ----------------------------------------------------------------------------
    Operating System : Microsoft Windows 10 Pro
    Version          : 10.0.17134
    ----------------------------------------------------------------------------
    CPU Name         : Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz
    Description      : Intel64 Family 6 Model 58 Stepping 9
    Cores (Threads)  : 4 (8)      : Architecture  : x64
    Clock Speed      : 3901 MHz   : Bus Speed     : 100 MHz
    L2Cache          : 1 MB       : L3Cache       : 8 MB
    ----------------------------------------------------------------------------
    

    测试 1

    --- Standard input ------------------------------------------------------------
    | Value    |    Average |    Fastest |    Cycles | Garbage | Test |      Gain |
    --- Scale 10 --------------------------------------------------- Time 0.654 ---
    | BitShift |   2.433 µs |   2.045 µs |  12.379 K | 0.000 B | Pass |    0.00 % |
    | Convert  |   7.348 µs |   6.137 µs |  29.792 K | 0.000 B | Pass | -202.08 % |
    --- Scale 100 -------------------------------------------------- Time 0.618 ---
    | BitShift |   6.629 µs |   6.137 µs |  26.656 K | 0.000 B | Pass |    0.00 % |
    | Convert  |  37.805 µs |  33.320 µs | 136.246 K | 0.000 B | Pass | -470.31 % |
    --- Scale 1,000 ------------------------------------------------ Time 0.978 ---
    | BitShift |  56.409 µs |  48.519 µs | 201.670 K | 0.000 B | Pass |    0.00 % |
    | Convert  | 335.717 µs | 286.730 µs |   1.181 M | 0.000 B | Pass | -495.15 % |
    --- Scale 10,000 ----------------------------------------------- Time 3.723 ---
    | BitShift | 488.767 µs | 415.919 µs |   1.715 M | 0.000 B | Pass |    0.00 % |
    | Convert  |   3.209 ms |   2.720 ms |  10.955 M | 0.000 B | Pass | -556.46 % |
    --- Scale 100,000 --------------------------------------------- Time 39.832 ---
    | BitShift |   5.110 ms |   4.195 ms |  17.788 M | 0.000 B | Pass |    0.00 % |
    | Convert  |  42.987 ms |  35.171 ms | 141.218 M | 0.000 B | Pass | -741.28 % |
    -------------------------------------------------------------------------------
    

    【讨论】:

      【解决方案2】:

      像这样转换单曲:

      Convert.ToInt32("00001000", 2)
      

      我认为我们可以使用正则表达式来替换所有二进制数:

      Regex.Replace(binaryNumbers, @"\b\d+\b", new MatchEvaluator((m) => { 
          return Convert.ToInt32(m.Value, 2).ToString(); 
      }));
      

      【讨论】:

        猜你喜欢
        • 2013-11-24
        • 1970-01-01
        • 2012-05-02
        • 2019-05-18
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多