다음을 통해 공유


__lzcnt16, __lzcnt, __lzcnt64

Microsoft 전용

16비트, 32비트 또는 64비트 정수에서 선행 0의 수를 계산합니다.

구문

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

매개 변수

value
[in] 선행 0을 검색할 16비트, 32비트 또는 64비트 부호 없는 정수입니다.

반환 값

매개 변수의 선행 0비트 수입니다 value . 0이면 value 반환 값은 입력 피연산자(16, 32 또는 64)의 크기입니다. 가장 중요한 비트가 value 1이면 반환 값은 0입니다.

요구 사항

Intrinsic 아키텍처
__lzcnt16 AMD: ABM(고급 비트 조작)

Intel: Haswell
__lzcnt AMD: ABM(고급 비트 조작)

Intel: Haswell
__lzcnt64 AMD: 64비트 모드의 ABM(고급 비트 조작)입니다.

Intel: Haswell

헤더 파일<intrin.h>

설명

각 내장 함수는 명령을 생성합니다 lzcnt . 명령이 반환하는 lzcnt 값의 크기는 인수의 크기와 같습니다. 32비트 모드에서는 64비트 범용 레지스터가 없으므로 64비 lzcnt 트가 지원되지 않습니다.

명령에 대한 lzcnt 하드웨어 지원을 확인하려면 내장 함수를 __cpuid 호출하고 비트 5를 CPUInfo[2] (ECX)확인합니다InfoType=0x80000001. 명령이 지원되는 경우 이 비트는 1이고, 그렇지 않으면 0이 됩니다. 명령을 지원하지 lzcnt 않는 하드웨어에서 내장 함수를 사용하는 코드를 실행하면 결과를 예측할 수 없습니다.

명령을 지원하지 lzcnt 않는 Intel 프로세서에서는 명령 바이트 인코딩이 (비트 스캔 역방향)으로 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

Microsoft 전용 종료

이 콘텐츠의 일부는 고급 마이크로 디바이스, Inc.의 Copyright 2007입니다. 모든 권한이 예약되어 있습니다. 고급 마이크로 디바이스, Inc.의 권한으로 재현

참고 항목

컴파일러 내장 함수