将存储在整数列表(小端序)中的二进制表示形式转换为大整数

本文关键字:整数 表示 二进制 转换 列表 存储 | 更新日期: 2023-09-27 17:57:23

我有一个整数列表,比如L,它包含一个数字的二进制表示。列表 L 中的每个整数可以是 0 或 1。"最低有效位"在左侧(不在右侧)。

示例:1000001111表示(十进制)数字 961,0111010001表示 558。

我想将列表转换为大整数。

到目前为止,我已经尝试了以下方法:

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

但结果是完全错误的。任何人都可以帮助进行此转换吗?vb.net 示例的 C# 同样完美。

我还从这里的一个问题中研究了以下内容:

Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);

但仍然没有成功进行 Biginteger 转换。

将存储在整数列表(小端序)中的二进制表示形式转换为大整数

这应该有效,使用BitArray来帮助您获取值,以及来自 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)也有效。

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