Was ist ein sehr effizient wie man die Anzahl der Ziffern einer ganzen Zahl in C++ bestimmen kann?
Antworten
Zu viele Anzeigen?Praktischer Scherz: Dies ist die die effizienteste Art und Weise (die Anzahl der Ziffern wird zur Kompilierzeit berechnet):
template <unsigned long long N, size_t base=10>
struct numberlength
{
enum { value = 1 + numberlength<N/base, base>::value };
};
template <size_t base>
struct numberlength<0, base>
{
enum { value = 0 };
};
Kann nützlich sein, um die erforderliche Breite für Zahlenfelder in Formatierungen, Eingabeelementen usw. zu bestimmen.
Siehe Bit Twiddling Hacks für eine viel kürzere Version der Antwort, die Sie akzeptiert haben. Es hat auch den Vorteil, dass die Antwort schneller gefunden wird, wenn Ihre Eingabe normalverteilt ist, indem zuerst die großen Konstanten überprüft werden. (v >= 1000000000)
fängt 76 % der Werte ab, so dass es im Durchschnitt schneller ist, diese zuerst zu überprüfen.
Die ppc-Architektur verfügt über eine Bit-Zählanweisung. Damit kann man die logarithmische Basis 2 einer positiven ganzen Zahl in einem einzigen Befehl bestimmen. Bei 32 Bit wäre das zum Beispiel so:
#define log_2_32_ppc(x) (31-__cntlzw(x))
Wenn Sie mit einer kleinen Fehlermarge bei großen Werten zurechtkommen, können Sie diese mit ein paar weiteren Anweisungen in die Logarithmusbasis 10 umwandeln:
#define log_10_estimate_32_ppc(x) (9-(((__cntlzw(x)*1233)+1545)>>12))
Dies ist plattformspezifisch und etwas ungenau, beinhaltet aber auch keine Verzweigungen, Divisionen oder Konvertierung in Gleitkomma. Alles hängt davon ab, was Sie brauchen.
Ich kenne nur die ppc-Anweisungen auswendig, aber andere Architekturen sollten ähnliche Anweisungen haben.
14 Stimmen
In welcher Basis? 2? 10?
4 Stimmen
Ich würde es gerne zur Basis 10 machen
1 Stimmen
Ich habe einmal eine ähnliche Frage gestellt: Wie kann man die erste Ziffer einer int-Zahl ermitteln? In den Antworten wurden viele der gleichen Methoden wie unten beschrieben verwendet. Hier ist der Link, falls er für Ihre Aufgabe relevant ist [ [stackoverflow.com/questions/701322/]](http://stackoverflow.com/questions/701322/])
0 Stimmen
Ist die Inline-Montage zulässig?
0 Stimmen
Wie würde die Inline-Montage helfen?
1 Stimmen
Alle diese Antworten beziehen sich auf die Basis 10, aber es ist ziemlich einfach, das Ergebnis für jede beliebige Basis zu berechnen.
2 Stimmen
Was ist Ihr Maßstab für Effizienz? Zu den Optionen gehören die Minimierung der Codegröße, die Anzahl der CPU-Zyklen und sogar die Genauigkeit der Ergebnisse. Aber jedes dieser Kriterien ist anders zu verstehen. Und meinen Sie Dezimalstellen, Oktalstellen, Hexadezimalstellen oder etwas anderes?
0 Stimmen
Math.log10(value)+1
ist in jeder Hinsicht der effizienteste Weg.0 Stimmen
Auch: Wie viele Ziffern hat die
0
haben?