下面的代码将大的二进制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;
}
我希望有更快的代码来完全执行上面的代码应该做的事情。
答案 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);
}