Ziffer an int anhängen, ohne in String zu konvertieren?

8

Gibt es eine sichere Möglichkeit, eine Ziffer am Ende einer Ganzzahl hinzuzufügen, ohne sie in eine Zeichenkette umzuwandeln und ohne Stringstreams zu verwenden?

Ich habe versucht, die Antwort dafür googeln und die meisten Lösungen vorgeschlagen, es in eine Zeichenfolge konvertieren und Stringstreams verwenden, aber ich möchte es als Ganzzahl beibehalten, um die Datenintegrität zu gewährleisten und die Konvertierung von Typen zu vermeiden Ich lese auch eine Lösung, die vorschlägt, das int mit 10 zu multiplizieren und dann die Ziffer zu addieren, aber das könnte einen Integer-Überlauf verursachen.
Ist das sicher oder gibt es dafür eine bessere Methode? Und wenn ich das mit 10 multipliziere und die Ziffernlösung addiere, welche Vorkehrungen sollte ich treffen?

    
nmuntz 26.05.2009, 19:29
quelle

4 Antworten

25

Ihre beste Wette ist die Multiplikation mit 10 und Addition des Wertes. Du könntest eine naive Überprüfung wie folgt:

%Vor%     
user7116 26.05.2009, 19:32
quelle
3

Um einen Überlauf zu vermeiden:

%Vor%

Anstelle von MAX_INT könnten Sie std::numeric_limits<typeof(value)>::max() oder ähnliches verwenden, um andere Typen als int zu unterstützen.

    
Steve Jessop 26.05.2009 20:23
quelle
2
%Vor%     
Jim 26.05.2009 20:35
quelle
2

Hier ist eine bessere und kugelsicherere Implementierung als die, die als eine Antwort angenommen wurde, die auch schnell ist:

%Vor%

Sie sollten dies auch zu einer Inline-Funktion machen können. Die Überlaufprüfung wird nach dem ersten Vergleich fast immer kurzgeschlossen. Die Klausel nach && ist einfach so, dass Sie (im Falle einer 32-Bit-, Zweierkomplement-Ganzzahl) 5 zum Ende von 429496729 hinzufügen können, aber nicht 6.

    
Omnifarious 28.01.2010 05:24
quelle

Tags und Links