【问题标题】:easy and fast way to convert an int to binary?将int转换为二进制的简单快速方法?
【发布时间】:2018-10-22 23:42:38
【问题描述】:

我正在寻找类似 C# 中的 PHPs decbin 函数。该函数将小数转换为字符串的表示形式。

例如,当使用decbin(21) 时,它会返回10101 作为结果。

我发现 this function 基本上可以满足我的要求,但也许有更好/更快的方法?

【问题讨论】:

    标签: c#


    【解决方案1】:
    var result = Convert.ToString(number, 2);
    

    – 几乎是(否则无用的)Convert 类的唯一用途。

    【讨论】:

    • 哇, Convert.ToDateTime 还有另一种用途!非常好。
    • 哈哈,当你进行反射和泛型类型转换时总是有用的,但很有趣!
    【解决方案2】:

    大多数方法都会比您找到的功能更好更快。关于如何进行转换,这不是一个很好的例子。

    内置方法Convert.ToString(num, base) 是一个显而易见的选择,但如果您需要它以不同方式工作,您可以轻松编写替换。

    这是一个简单的方法,你可以指定二进制数的长度:

    public static string ToBin(int value, int len) {
       return (len > 1 ? ToBin(value >> 1, len - 1) : null) + "01"[value & 1];
    }
    

    它使用递归,第一部分(在 + 之前)调用自身来创建数字的二进制表示,除了最后一个数字,第二部分处理最后一个数字。

    例子:

    Console.WriteLine(ToBin(42, 8));
    

    输出:

    00101010
    

    【讨论】:

    • 谢谢,也是非常不错的选择!我已经怀疑我找到的功能不是最好的方法。
    • +1 表示递归。虽然我真的不喜欢在那里使用null,但"" 也可以。
    • 虽然您的示例是一个很好的说明,但请注意,此特定功能可以更简单有效地实现为:string s = Convert.ToString(value, 2); return new string('0', len - s.Length) + s;(假设二进制数符合提供的长度)
    【解决方案3】:
    int toBase = 2;
    string binary = Convert.ToString(21, toBase); // "10101"
    

    【讨论】:

      【解决方案4】:

      使二进制值具有(至少)指定位数,用零填充:

      string bin = Convert.ToString(1234, 2).PadLeft(16, '0');
      

      Convert.ToString 将转换为二进制字符串。
      PadLeft 添加零以填充最多 16 位数字。

      【讨论】:

        【解决方案5】:

        这是我的回答:

            static bool[] Dec2Bin(int value)
            {
                if (value == 0) return new[] { false };
                var n = (int)(Math.Log(value) / Math.Log(2));
                var a = new bool[n + 1];
                for (var i = n; i >= 0; i--)
                {
                    n = (int)Math.Pow(2, i);
                    if (n > value) continue;
                    a[i] = true;
                    value -= n;
                }
                Array.Reverse(a);
                return a;
            }
        

        使用 Pow 代替模和除法,所以我认为这是更快的方式。

        【讨论】:

          猜你喜欢
          • 2012-06-12
          • 1970-01-01
          • 2013-11-07
          • 2017-12-22
          • 2010-12-13
          • 2017-03-02
          • 1970-01-01
          • 2012-12-22
          • 2012-12-30
          相关资源
          最近更新 更多