172 Stimmen

Effizienter Weg zur Bestimmung der Anzahl der Ziffern in einer ganzen Zahl

Was ist ein sehr effizient wie man die Anzahl der Ziffern einer ganzen Zahl in C++ bestimmen kann?

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/])

11voto

blinnov.com Punkte 307

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.

10voto

Josh Haberman Punkte 4110

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.

8voto

bemaru Punkte 101
int x = 1000;
int numberOfDigits = x ? static_cast<int>(log10(abs(x))) + 1 : 1;

7voto

Ira Baxter Punkte 91118

Ein Vorposter hat eine Schleife vorgeschlagen, die durch 10 dividiert. Da Multiplizierungen auf modernen Maschinen viel schneller sind, würde ich stattdessen den folgenden Code empfehlen:

 int digits = 1, pten=10; while ( pten <= number ) { digits++; pten*=10; }

5voto

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X