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



下面的代码将大二进制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;
} 

我想拥有更快的代码来完成上述代码应该做的事情。

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

此外,您可以缓存1个大整数值1(整数被装箱为大整数(

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

我的测试速度要快得多。

我认为每个char的大字符串不是一个好方法。

char c in binaryAsString

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

BigInteger(Byte[])

因此,第一件事是将字符串转换为字节数组,然后构建您的大整数。其余代码是从此答案中复制的:将二进制字符串表示形式转换为字节数组

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);
}

最新更新