__lzcnt16, __lzcnt, __lzcnt64

Specyficzne dla firmy Microsoft

Zlicza liczby zer wiodących w 16-, 32-lub 64-bitowej liczbie całkowitej.

Składnia

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

Parametry

wartość
[in] 16-, 32-bitowa lub 64-bitowa liczba całkowita bez znaku w celu skanowania pod kątem zer wiodących.

Wartość zwracana

Liczba bitów zera wiodącego w parametrze value . Jeśli value ma wartość zero, zwracana wartość to rozmiar operandu wejściowego (16, 32 lub 64). Jeśli najbardziej znaczący bit value to jeden, zwracana wartość to zero.

Wymagania

Wewnętrzne Architektura
__lzcnt16 AMD: Zaawansowane manipulowanie bitami (ABM)

Intel: Haswell
__lzcnt AMD: Zaawansowane manipulowanie bitami (ABM)

Intel: Haswell
__lzcnt64 AMD: Advanced Bit Manipulation (ABM) w trybie 64-bitowym.

Intel: Haswell

Plik<nagłówka intrin.h>

Uwagi

Każda z funkcji wewnętrznych generuje instrukcję lzcnt . Rozmiar wartości zwracanej przez lzcnt instrukcję jest taki sam jak rozmiar argumentu. W trybie 32-bitowym nie ma rejestrów ogólnego przeznaczenia 64-bitowych, więc 64-bitowe lzcnt nie jest obsługiwane.

Aby określić obsługę sprzętu lzcnt instrukcji, wywołaj __cpuid funkcję wewnętrzną za pomocą InfoType=0x80000001 polecenia i sprawdź bit 5 z CPUInfo[2] (ECX). Ten bit będzie mieć wartość 1, jeśli instrukcja jest obsługiwana, a w przeciwnym razie 0. Jeśli uruchamiasz kod korzystający z wewnętrznego sprzętu, który nie obsługuje lzcnt instrukcji, wyniki są nieprzewidywalne.

Na procesorach Intel, które nie obsługują lzcnt instrukcji, kodowanie bajtów instrukcji jest wykonywane jako bsr (odwrotne skanowanie bitowe). Jeśli przenośność kodu jest problemem, rozważ użycie funkcji _BitScanReverse wewnętrznej. Aby uzyskać więcej informacji, zobacz _BitScanReverse, _BitScanReverse64.

Przykład

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

END Microsoft Specific

Części tej zawartości to Copyright 2007 firmy Advanced Micro Devices, Inc. Wszelkie prawa zastrzeżone. Odtworzony z uprawnieniami firmy Advanced Micro Devices, Inc.

Zobacz też

Funkcje wewnętrzne kompilatora