__lzcnt16, __lzcnt, __lzcnt64
Microsoft-spezifisch
Zählt die Anzahl der führenden Nullen in einer ganzzahligen 16-, 32- oder 64-Bit-Zahl.
Syntax
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Parameter
value
[in] Die 16-, 32- oder 64-Bit-Ganzzahl ohne Vorzeichen, um nach führenden Nullen zu suchen.
Rückgabewert
Die Anzahl der führenden Nullbits im value
Parameter. Wenn value
null ist, ist der Rückgabewert die Größe des Eingabeopernden (16, 32 oder 64). Wenn das wichtigste Bit eines value
ist, ist der Rückgabewert null.
Anforderungen
Intrinsic | Aufbau |
---|---|
__lzcnt16 |
AMD: Erweiterte Bitmanipulation (ABM) Intel: Haswell |
__lzcnt |
AMD: Erweiterte Bitmanipulation (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Advanced Bit Manipulation (ABM) im 64-Bit-Modus. Intel: Haswell |
Headerdatei<intrin.h>
Hinweise
Jede der systeminternen Werte generiert die lzcnt
Anweisung. Die Größe des von der lzcnt
Anweisung zurückgegebenen Werts entspricht der Größe des Arguments. Im 32-Bit-Modus gibt es keine allgemeinen 64-Bit-Register, sodass die 64-Bit-Version lzcnt
nicht unterstützt wird.
Um die Hardwareunterstützung für die lzcnt
Anweisung zu ermitteln, rufen Sie die __cpuid
systeminterne Verbindung auf InfoType=0x80000001
, und überprüfen Sie Bit 5 von CPUInfo[2] (ECX)
. Dieses Bit ist 1, wenn die Anweisung unterstützt wird, und andernfalls 0. Wenn Sie Code ausführen, der die systeminterne Hardware verwendet, die die lzcnt
Anweisung nicht unterstützt, sind die Ergebnisse unvorhersehbar.
Auf Intel-Prozessoren, die die lzcnt
Anweisung nicht unterstützen, wird die Bytecodierung der Anweisung als bsr
ausgeführt (Bitscan reverse). Wenn die Codeübertragbarkeit ein Problem darstellt, sollten Sie stattdessen die _BitScanReverse
systeminterne Verwendung in Betracht ziehen. Weitere Informationen finden Sie unter _BitScanReverse, _BitScanReverse64.
Beispiel
// Compile this test with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;
int main()
{
unsigned short us[3] = {0, 0xFF, 0xFFFF};
unsigned short usr;
unsigned int ui[4] = {0, 0xFF, 0xFFFF, 0xFFFFFFFF};
unsigned int uir;
for (int i=0; i<3; i++) {
usr = __lzcnt16(us[i]);
cout << "__lzcnt16(0x" << hex << us[i] << ") = " << dec << usr << endl;
}
for (int i=0; i<4; i++) {
uir = __lzcnt(ui[i]);
cout << "__lzcnt(0x" << hex << ui[i] << ") = " << dec << uir << endl;
}
}
__lzcnt16(0x0) = 16
__lzcnt16(0xff) = 8
__lzcnt16(0xffff) = 0
__lzcnt(0x0) = 32
__lzcnt(0xff) = 24
__lzcnt(0xffff) = 16
__lzcnt(0xffffffff) = 0
Ende Microsoft-spezifisch
Teile dieser Inhalte sind Copyright 2007 von Advanced Micro Devices, Inc. Alle Rechte vorbehalten. Vervielfältigt mit Erlaubnis von Advanced Micro Devices, Inc.