Поделиться через


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

См. также

Встроенные компоненты компилятора