将大型二进制字符串转换为BigInteger的更快方法

时间:2019-05-28 00:56:47

标签: c#

下面的代码将大的二进制string binaryAsString = "1010101011101011......."转换为BigInteger十进制,但这很慢,需要很长时间才能完成。有没有更快的方法可以做到这一点?在此之前,我在将BitArray转换为string时遇到了问题。我的第一个代码花了很长时间,但是我发现了新的代码,它的速度比我想象的要快得多。我希望我可以找到一种类似的更快的方法来完成此操作,因为这确实需要很长时间。

我尝试使用String whatever = Convert.ToString(binaryAsString, 2);,但这根本不起作用。

// converting the binary String to decimal 
BigInteger Decimalvalue = 0;  

foreach (char c in binaryAsString) 
{
    Decimalvalue <<= 1;

    Decimalvalue += c == '1' ? 1 : 0;

} 

我希望有更快的代码来完全执行上面的代码应该做的事情。

3 个答案:

答案 0 :(得分:0)

您可以使用or运算符而不是+。

此外,您可以缓存1的大整数值(将整数装箱成一个大整数)

BigInteger one = 1;
foreach (char c in s)
{
    integer <<= 1;
    if (c == '1')
        integer |= one;
}

在我的测试中,速度要快得多。

答案 1 :(得分:0)

我认为将任意大数从二进制转换为十进制非常具有挑战性;您将面临可以分配多少内存的物理限制。 在StackOverflow社区中,我找到了两个答案。

1。BigInteger to Hex/Decimal/Octal/Binary strings  2。Convert large binary string to decimal system

请参考链接以获取针对Converting From Binary to Decimal Numbers 的更多详细信息

答案 2 :(得分:0)

我认为按每个字符处理大字符串不是一个好方法。

char c in binaryAsString

看看BigInteger的构造函数,您可以找到:

BigInteger(Byte[])

因此,第一件事是将字符串转换为字节数组,然后构造您的大整数。其余代码是从此答案中复制的:Convert a binary string representation to a byte array

int numOfBytes = binaryAsString.Length / 8;
byte[] bytes = new byte[numOfBytes];
for(int i = 0; i < numOfBytes; ++i)
    bytes[i] = Convert.ToByte(binaryAsString.Substring(8 * i, 8), 2);

选项1 。使用string.PadLeft

if((binaryAsString.Length % 8) != 0)
{
    var totalWidth = (binaryAsString.Length / 8 + 1) * 8;
    binaryAsString = binaryAsString.PadLeft(totalWidth, '0');
}

选项2 。从尾部转换

int numOfBytes = binaryAsString.Length / 8;
if((binaryAsString.Length % 8) != 0)
    numOfBytes++;
byte[] bytes = new byte[numOfBytes];
for(int i = 1; i <= numOfBytes; ++i)
{
    int start = binaryAsString.Length - i * 8;
    int length = 8;
    if(start < 0)
    {
        length += start;
        start = 0;
    }
    bytes[numOfBytes - i] = Convert.ToByte(binaryAsString.Substring(start, length), 2);
}