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