【发布时间】:2018-10-22 23:42:38
【问题描述】:
我正在寻找类似 C# 中的 PHPs decbin 函数。该函数将小数转换为字符串的表示形式。
例如,当使用decbin(21) 时,它会返回10101 作为结果。
我发现 this function 基本上可以满足我的要求,但也许有更好/更快的方法?
【问题讨论】:
标签: c#
我正在寻找类似 C# 中的 PHPs decbin 函数。该函数将小数转换为字符串的表示形式。
例如,当使用decbin(21) 时,它会返回10101 作为结果。
我发现 this function 基本上可以满足我的要求,但也许有更好/更快的方法?
【问题讨论】:
标签: c#
var result = Convert.ToString(number, 2);
– 几乎是(否则无用的)Convert 类的唯一用途。
【讨论】:
大多数方法都会比您找到的功能更好更快。关于如何进行转换,这不是一个很好的例子。
内置方法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
【讨论】:
null,但"" 也可以。
string s = Convert.ToString(value, 2); return new string('0', len - s.Length) + s;(假设二进制数符合提供的长度)
int toBase = 2;
string binary = Convert.ToString(21, toBase); // "10101"
【讨论】:
使二进制值具有(至少)指定位数,用零填充:
string bin = Convert.ToString(1234, 2).PadLeft(16, '0');
Convert.ToString 将转换为二进制字符串。
PadLeft 添加零以填充最多 16 位数字。
【讨论】:
这是我的回答:
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 代替模和除法,所以我认为这是更快的方式。
【讨论】: