Wie kann ich __builtin_ctzll in meinem C++ Projekt benutzen?

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

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);
Paolinus 
Fragesteller
 19.07.2023, 09:13

Danke für die Antwort. Ja ich habe auch schon eine manuelle Methode gefunden, ich dachte nur es geht mit dieser vorgefertigten Methode schneller.

0