Wie kann ich __builtin_ctzll in meinem C++ Projekt benutzen?
Hallo Community,
ich bin im Zuge eines größeren Programmierprojekts auf die sogenannten builtin functions gestoßen. Wie kann ich die in meinem VS C++ Projekt nutzen?
Ich habe herausgefunden dass die Erweiterungen nicht standardmäßig in C++ enthalten sind, sie kommen wohl vom GNU Projekt. Aber irgendwie muss man die schließlich einbinden können, oder? über ein #include zum Beispiel?
Momentan taucht die Fehlermeldung auf, der Bezeichner wurde nicht gefunden.
1 Antwort
a) Du kompilierst dein Projekt mit dem GCC.
b) In Visual Studio C++-Projekten wird standardmäßig der MSVC für die Kompilierung genutzt. Die Funktion des GCC kannst du mit Hilfe der intrinsischen Funktionen nachbilden, die der MSVC zur Verfügung stellt:
#include <intrin.h>
uint32_t __inline ctz(uint32_t value) {
unsigned long trailingZeros = 0;
if (_BitScanForward(&trailingZeros, value)) {
return trailingZeros;
}
return 32;
}
Ebenso könntest du mit einer Schleife und Bitoperationen über die Zahl laufen. Bei jedem Durchlauf verschiebst du die Zahl um eine Stelle nach rechts (d.h. eine Zahl wird auf der rechten Seite weggenommen). Wenn die aktuelle Zahl verknüpft mit 1 den Wert 0 ergibt, gibt es auch noch eine 0 am Ende.
Nur einmal an einem halben Byte demonstriert:
0100 => 0100 & 0001 = 0000
0010 => 0010 & 0001 = 0000
0001 => 0001 & 0001 = 0001
Code:
uint32_t counter = 0;
for (; 0 == (1 & value) && counter < 32; ++counter, value >>= 1);
Danke für die Antwort. Ja ich habe auch schon eine manuelle Methode gefunden, ich dachte nur es geht mit dieser vorgefertigten Methode schneller.