c# - Conversión de una representación binaria almacenada en una lista de enteros(little endian) en un Biginteger
vb.net type-conversion (2)
Tengo una lista de enteros, digamos L que contiene la representación binaria de un número. Cada número entero en la lista L puede ser 0 o 1. El "bit menos significativo" está a la izquierda (no a la derecha).
Ejemplo: 1000001111 para el número (decimal) 961 o 0111010001 para 558.
Quiero convertir la lista en Biginteger.
He intentado lo siguiente hasta ahora:
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
pero el resultado es completamente incorrecto. ¿Alguien puede ayudar a hacer esta conversión? Los ejemplos de c # of vb.net son igualmente perfectos.
También he considerado algo como lo siguiente tomado de una pregunta aquí:
Buffer.BlockCopy(intArray, 0, byteArray, 0, byteArray.Length);
pero aún sin éxito con la conversión de Biginteger.
Enfoque de cambio de bit imperativo ligeramente más largo en 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
Esto debería funcionar, usando un BitArray
para ayudarlo a obtener los valores, y este fragmento de Jon Skeet para convertirlo en un 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
Si el rendimiento es crítico, probablemente puedas mejorarlo construyendo tu byte[]
usando el cambio de bit. Pero esto es decentemente (IMO) conciso, legible y (supongo) código rápido tal como está.
558 ( 0,1,1,1,0,1,0,0,0,1
) también funciona.