Condividi tramite


__lzcnt16, __lzcnt, __lzcnt64

Sezione specifica Microsoft

Conta il numero di zeri iniziali in un intero a 16, a 32 o a 64 bit.

Sintassi

unsigned short __lzcnt16(
   unsigned short value
);
unsigned int __lzcnt(
   unsigned int value
);
unsigned __int64 __lzcnt64(
   unsigned __int64 value
);

Parametri

value
[in] Intero senza segno a 16, 32 o 64 bit per cercare zeri iniziali.

Valore restituito

Numero di bit zero iniziali nel value parametro . Se value è zero, il valore restituito corrisponde alla dimensione dell'operando di input (16, 32 o 64). Se il bit più significativo di value è uno, il valore restituito è zero.

Requisiti

Intrinsic Architettura
__lzcnt16 AMD: Advanced Bit Manipulation (ABM)

Intel: Haswell
__lzcnt AMD: Advanced Bit Manipulation (ABM)

Intel: Haswell
__lzcnt64 AMD: Advanced Bit Manipulation (ABM) in modalità a 64 bit.

Intel: Haswell

<File di intestazione intrin.h>

Osservazioni:

Ognuna delle funzioni intrinseche genera l'istruzione lzcnt . La dimensione del valore restituito dall'istruzione lzcnt corrisponde alla dimensione del relativo argomento. In modalità a 32 bit non sono presenti registri per utilizzo generico a 64 bit, quindi il bit a 64 bit lzcnt non è supportato.

Per determinare il supporto hardware per l'istruzione lzcnt , chiamare l'intrinseco __cpuid con InfoType=0x80000001 e controllare il bit 5 di CPUInfo[2] (ECX). Questo bit sarà 1 se l'istruzione è supportata e 0 in caso contrario. Se si esegue codice che usa l'intrinseco sull'hardware che non supporta l'istruzione lzcnt , i risultati sono imprevedibili.

Nei processori Intel che non supportano l'istruzione lzcnt , la codifica dei byte di istruzioni viene eseguita come bsr (analisi bit inversa). Se la portabilità del codice è un problema, prendere in considerazione l'uso dell'intrinseco _BitScanReverse . Per altre informazioni, vedere _BitScanReverse, _BitScanReverse64.

Esempio

// 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

Fine sezione specifica Microsoft

Parti di questo contenuto sono Copyright 2007 di Advanced Micro Devices, Inc. Tutti i diritti riservati. Riprodotto con l'autorizzazione da Advanced Micro Devices, Inc.

Vedi anche

Intrinseci del compilatore