__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.

Siehe auch

Systeminterne Compiler