Python kennt ja keine Grenzen und auch keine Grösse für seine Integer.
Code: Alles auswählen
>>> zahl = 18382838243
>>> zahl
18382838243L
>>> len(zahl)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: object of type 'long' has no len()
Aber da Python Integers keine Obergrenze haben, muss ich deswegen vorher ganz genau wissen, wieviele Q's, sprich wieviele 64 bit Blöcke, hintereinander ich benötige, um das Pyhton Integer n abzubilden.
Je grösser die Zahl desto mehr 64 bit (8 byte) Blöcke brauche ich.
Anders gesprochen, ich muss einen String aus 8 byte Vielfachen bauen und dann die Zahl "reinladen", gesucht ist aber zu jeder Zahl N das dazugehörige 8 byte Vielfache X.
Das "reinladen" ist etwas kompliziert, es geht nicht direkt, aber stellt auch nicht wirklich das Problem dar.
Was ich suche ist eine Funktion, die mir zu jedem N das richtige X zurückgibt.
Beispiel:
0 < N <= 2**64 -----> X = 1 (* 8 byte)
2**64 < N <= 2**128 -----> X = 2 (* 8 byte)
2**128 < N <= 2**192 -----> X = 3 (* 8 byte)
... usw. ...
NB: Ich fange bei 1 an zu zählen, nicht bei Null, daher auch 0 < N <= 2**64 und nicht N von 0 bis 2**64-1.
Ich hab schon mit math.log() und math.ceil() etwas rumgespielt, aber irgendwie kommt da nicht das raus, was ich vermutete.
Code: Alles auswählen
>>> from math import log
>>> log(1,2**64)
0.0
>>> log(2,2**64)
0.015625
>>> log(2**64,2**64)
1.0
>>> log(2**64+1,2**64)
1.0
>>> log(2**64+2,2**64)
1.0
>>> log(2**65,2**64)
1.015625
>>> log(2**128,2**64)
2.0
Um bis 2 zählen zu können, braucht man dann einige 64 bit (sprich mindestens 1 64 bit Block). [RICHTIG]
Um bis 2**64 zählen zu können, muss schon 1 mal 64 bit vorhanden sein. [RICHTIG]
Um bis 2**64 + 1 oder +2 zählen zu können, reichen 64 bit immer noch aus. [FALSCH]
Für 2**128 braucht man genau 2 x 64 bit Blöcke. [RICHTIG]
Ihr seht das reimt sich vorne und hinten nicht ganz mit der Logik.
Wie berechne ich die Anzahl der 64 bit Blöcke korrekt?
(Mathe ist schon so lange her gewesen bei mir... )