我有一个整数列表,比如L,它包含一个数字的二进制表示。 列表L中的每个整数可以是0或1."最低有效位"在左边(不在右边)。
示例:1000001111表示(十进制)数字961,或0111010001表示558。
我想将列表转换为Biginteger。
到目前为止,我已尝试过以下内容:
Dim bytes(L.Count - 1) As Byte
For i As Integer = 0 to L.Count - 1
bytes(i) = CByte(L(i))
Next
Dim Value As New BigInteger(bytes)
Return Value
但结果完全错了。任何人都可以帮助进行此转换吗? c#的vb.net示例同样完美。
我还从这里的一个问题中搜索了以下内容:
Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);
但Biginteger转换仍然没有成功。
答案 0 :(得分:3)
这应该有效,使用BitArray
来帮助您获取值,并使用this snippet from Jon Skeet将其转换为byte[]
。
int[] ints = new[] { 1,0,0,0,0,0,1,1,1,1 };
// 1,0,0,... becomes true,false,false,... with this Select
BitArray bits = new BitArray(ints.Select(x => x > 0).ToArray());
byte[] bytes = new byte[(bits.Length + 7) / 8];
bits.CopyTo(bytes, 0);
BigInteger bigInt = new BigInteger(bytes); // 961
如果性能至关重要,您可以通过使用位移构建byte[]
来改善性能。但这是正确的(IMO)简洁,可读,并且(我希望)快速代码原样。
558(0,1,1,1,0,1,0,0,0,1
)也有效。
答案 1 :(得分:2)
VB.Net中稍微长一点的命令式位移方式:
Function ToBigInteger(bits As List(Of Byte)) As BigInteger
Dim byteCount = (bits.Count + 7) >> 3
Dim bytes(byteCount) As Byte
For i = 0 To bits.Count - 1
If bits(i) <> 0 Then
bytes(i >> 3) = bytes(i >> 3) Or CByte(1 << (i And 7))
End If
Next
Return New BigInteger(bytes)
End Function