__lzcnt16, __lzcnt, __lzcnt64
Блок, относящийся только к системам Майкрософт
Подсчитывает число начальных нулей в 16-, 32-или 64-разрядном целочислении.
Синтаксис
unsigned short __lzcnt16(
unsigned short value
);
unsigned int __lzcnt(
unsigned int value
);
unsigned __int64 __lzcnt64(
unsigned __int64 value
);
Параметры
значение
[in] 16-, 32-или 64-разрядное целое число без знака для проверки начальных нулей.
Возвращаемое значение
Число начальных нулевых битов в параметре value
. Если value
значение равно нулю, возвращаемое значение — это размер входного операнда (16, 32 или 64). Если самый значительный бит value
равен одному, возвращаемое значение равно нулю.
Требования
Intrinsic | Архитектура |
---|---|
__lzcnt16 |
AMD: Расширенная обработка битов (ABM) Intel: Haswell |
__lzcnt |
AMD: Расширенная обработка битов (ABM) Intel: Haswell |
__lzcnt64 |
AMD: Расширенная обработка битов (ABM) в 64-разрядном режиме. Intel: Haswell |
Файл<заголовка intrin.h>
Замечания
Каждая из встроенных функций создает инструкцию lzcnt
. Размер возвращаемого инструкцией значения lzcnt
совпадает с размером аргумента. В 32-разрядном режиме нет 64-разрядных регистров общего назначения, поэтому 64-разрядная lzcnt
версия не поддерживается.
Чтобы определить поддержку оборудования для инструкции lzcnt
, вызовите __cpuid
встроенную функцию InfoType=0x80000001
и проверьте бит 5 CPUInfo[2] (ECX)
. Этот бит будет равен 1, если инструкция поддерживается, и 0 в противном случае. Если вы запускаете код, использующий встроенную функцию на оборудовании, которое не поддерживает инструкцию lzcnt
, результаты непредсказуемы.
На процессорах Intel, которые не поддерживают инструкцию lzcnt
, кодирование байтов инструкций выполняется как bsr
(обратный просмотр битов). Если переносимость кода является проблемой, рассмотрите возможность использования встроенной _BitScanReverse
функции. Дополнительные сведения см. в _BitScanReverse _BitScanReverse64.
Пример
// 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
Завершение блока, относящегося только к системам Майкрософт
Часть этого содержимого — авторские права 2007 advanced Micro Devices, Inc. Все права защищены. Воспроизводится с разрешением от Advanced Micro Devices, Inc.