Für viele Zwecke sind kurze Strings/Char-Arrays, die in eine vorzeichenlose 32-Bit-Ganzzahl gepackt sind, ziemlich nützlich, da sie auf einen Schlag mit einem einfachen Ganzzahlvergleich verglichen und in switch
-Anweisungen verwendet werden können Lesbarkeit.Was ist der effizienteste Weg, um eine kurze Zeichenfolge in eine 32-Bit-Ganzzahl zu konvertieren?
Der häufigste Weg, um diese kurzen Strings zu 32-Bit-Integer zu konvertieren ist zu verschieben/oder:
#include <stdint.h>
uint32_t quadchar(const char* _str)
{
uint32_t result = 0;
for(size_t i=0; i<4; i++)
{
if(_str[i] == 0)
return result;
result = (result << 8) | _str[i];
}
return result;
}
Strings, die zu lang sind, wird abgeschnitten.
So weit so gut, aber das muss zur Laufzeit gemacht werden, was ein bisschen Zeit kostet. Wäre es auch möglich, dies zur Kompilierzeit zu tun?
Mit C++ 14 und später müssen Sie nur noch "constexpr" zu Ihrer Funktion hinzufügen. Es gibt bereits eine Antwort, die zeigt, wie dies (nämlich rekursiv) für C++ 11 zu tun ist. Für C++ 03 ist es praktisch unmöglich, eine gute Syntax zu erhalten, aber eine C++ 03-Lösung ist die Quellcode-Vorverarbeitung über ein Skript. –
Die Union-Methode wäre ein undefiniertes Verhalten, und das Ergebnis hängt von der Endianess der CPU ab. – Barmar
@Barmar: wahr, thx. Ich habe diese Passage entfernt. – user2328447