Ich bin mir nicht sicher, ob ich dem, was Sie mit BigInt gemacht haben, gefolgt bin, aber Sie können Strings verwenden, um BigInts zu definieren und das bringt Sie näher an das, was Sie wollen.
Zum Beispiel Sie hatte:
val number:BigInt = 999 // guessed a number
val time = System.currentTimeMillis // results in Long = 1465400383430
val usedBits = 64 - java.lang.Long.numberOfLeadingZeros(time) // results in Int = 41
val newNumber = (number << usedBits) | time // results in BigInt = 2198289632679878
Sie stattdessen die letzte Zeile ändern könnte:
val newNumber2 = BigInt(number.toString + time.toString) // BigInt = 9991465400383430
int der Differenz zu vertiefen (es ist nur 3 Bit):
newNumber.bitLength
= 51
newNumber2.bitLength
= 54
und die binären
newNumber.toLong.toBinaryString
= " 111110011110101010100110000101010110101011111000110"
newNumber2.toLong.toBinaryString
= "100011011111110010111101010001111110011011011111000110"
Bis heute hätte ich nicht mit BigInt als Bits zu packen. Aber zumindest in diesem Fall funktioniert es ganz gut und als Bonus, wenn Sie die zweite Methode verwenden und wenn Sie die Länge Ihrer numerischen Strings kennen, können die Werte leicht extrahiert werden. Cool :-)
Wenn führende Nullen ignoriert werden, woher wissen Sie, wie viele Bits später vom Zeitstempel verbraucht werden? (Das hat nichts mit Ihrer Frage zu tun, ich bin nur neugierig auf den Anwendungsfall) –
Der Zeitstempel ist das letzte Element des "Byte-Streams" und das einzige Element ohne feste Größe. Nachdem alle anderen Elemente verbraucht sind, muss der verbleibende Teil der Zeitstempel sein. – ceran
OK. Für Ihre Frage, angesichts der Bir-Fiddling, die Sie tun müssen, scheint es vernünftig. Ich bin weniger überzeugt von der Verwendung von BigInt als die Datenstruktur, um eine Byte-Strea zu halten, aber ich bin sicher, dass Sie Ihre Gründe haben! –