Вы можете использовать BigInteger.toByteArray()
и BitSet.toByteArray()
для них:
BigInteger bi = new BigInteger("31415926535");
bi = bi.multiply(new BigInteger("271828"));
System.out.println(bi);
BitSet bs = BitSet.valueOf(bi.toByteArray());
System.out.println(bs);
BigInteger bi2 = new BigInteger(bs.toByteArray());
System.out.println(bi2);
Вы можете использовать конструктор BigInteger(byte[])
преобразовать массив байтов в BigInteger
и BitSet.valueOf(byte[])
для преобразования данных в требуемые значения.
Для получения данного кода, он выводит:
8539728478155980
{1, 2, 3, 4, 9, 10, 12, 14, 17, 18, 20, 22, 23, 25, 27, 28, 29, 30, 32, 33, 35, 37, 38, 42, 44, 45, 50, 51, 54, 55}
8539728478155980
Обратите внимание, что используется 2-дополнение обозначения. Таким образом, для отрицательных чисел он будет генерировать дополнительные. А для 2^64-1
потребуется более 64
бит. Это также работает с big endian. (см. измененный ответ ниже).
EDIT: есть одна проблема с этим подходом: если есть хвосты хвоста, они не учитываются программой. Это может быть важно, потому что они являются частью представления. Вы можете решить эту проблему, добавив хвостохранилища немного:
public static BitSet convertTo (BigInteger bi) {
byte[] bia = bi.toByteArray();
int l = bia.length;
byte[] bsa = new byte[l+1];
System.arraycopy(bia,0,bsa,0,l);
bsa[l] = 0x01;
return BitSet.valueOf(bsa);
}
public static BigInteger convertFrom (BitSet bs) {
byte[] bsa = bs.toByteArray();
int l = bsa.length-0x01;
byte[] bia = new byte[l];
System.arraycopy(bsa,0,bia,0,l);
return new BigInteger(bia);
}
И назвать его:
BigInteger bi = new BigInteger("20000000");
System.out.println(bi);
BitSet bs = convertTo(bi);
System.out.println(bs);
BigInteger bi2 = convertFrom(bs);
System.out.println(bi2);
об использовании памяти
В целом оба метода будут использовать примерно такое же количество бит. Для первой реализации (без маркера размера и, следовательно, ошибок) возможно, что иногда подход BitSet
будет использовать один байт меньше, чем подход BigInteger
. С маркером размера (второй подход) это наоборот: в общем случае BitSet
будет использовать всегда один дополнительный байт, за исключением некоторых редких случаев.
Я предполагаю, что вы имеете в виду 'BigInteger', а не' BigInt'? –
Да, извиняюсь за это. –
дополнительное замечание: имеет ли смысл иметь дело, потому что это важный аспект. '3' теперь представлен как' {0,1} '. Таким образом, бит 'i'-th принимает значение« 2^i »как значение. –