2016-06-08 11 views
0

Was ich tun möchte, um den aktuellen Zeitstempel in eine Anzahl von Typ BigInt einfügen. Alles im BigInt sollte nach links verschoben werden, um Platz für den Zeitstempel zu schaffen. Führende Nullen des Zeitstempels sollten jedoch ignoriert werden.Scala: Einfügen Long in BigInt mit Bitverschiebung

Was ich im Moment mache:

val number: BigInt = ... 
val time = System.currentTimeMillis 
val usedBits = 64 - java.lang.Long.numberOfLeadingZeros(time) 
val newNumber = (number << usedBits) | t 

Gibt es einen besseren Weg, dies zu tun? Vor allem die dritte Zeile scheint nicht sehr elegant zu sein.

+0

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) –

+0

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

+0

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! –

Antwort

0

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 :-)

+0

. Die .toString wird sehr langsam sein. Und ich denke du meinst takeRight (13). Und die 13 variiert, die Zeit wird jedes Mal anders sein –

+0

Ja, natürlich. Vielen Dank. –

+0

Und noch wichtiger, das funktioniert einfach nicht. Überlegen Sie, ob die Zeit zu 1 führte. Das OP möchte, dass das niedrigste Bit des BigInt 1 ist. Sie haben die niedrigste 10er-Ziffer als Eins, was nicht das Gleiche ist. –