Namespaces
Variants

stdc_leading_zeros

From cppreference.net
헤더에 정의됨 <stdbit.h>
unsigned int stdc_leading_zeros_uc ( unsigned char value ) [ [ unsequenced ] ] ;
(1) (C23부터)
unsigned int stdc_leading_zeros_us ( unsigned short value ) [ [ unsequenced ] ] ;
(2) (C23부터)
unsigned int stdc_leading_zeros_ui ( unsigned int value ) [ [ unsequenced ] ] ;
(3) (C23부터)
unsigned int stdc_leading_zeros_ul ( unsigned long int value ) [ [ unsequenced ] ] ;
(4) (C23부터)
unsigned int stdc_leading_zeros_ull ( unsigned long long int value ) [ [ unsequenced ] ] ;
(5) (C23부터)
#define stdc_leading_zeros( value )

// 노출된 인터페이스:

generic_return_type stdc_leading_zeros ( generic_value_type value ) [ [ unsequenced ] ] ;
(6) (C23부터)
1-5) 가장 중요한 비트부터 시작하여 0 비트가 연속으로 나타나는 개수를 반환합니다.
6) 타입-제네릭 함수( generic_value_type 인자로 표시됨)는 입력 값의 타입이 다음 중 하나인 경우 해당 타입에 적합한 값을 반환합니다:
  • 표준 부호 없는 정수 타입( bool 제외);
  • 확장 부호 없는 정수 타입;
  • 또는 표준/확장 정수 타입과 너비가 일치하는 비트-정밀 부호 없는 정수 타입( bool 제외).
generic_return_type 은 계산된 결과를 표현할 수 있는 적절한 큰 부호 없는 정수 타입이어야 합니다.

목차

매개변수

value - 부호 없는 정수형의 값

반환값

값에서 가장 상위 비트부터 시작하여 연속된 0 비트의 개수입니다.

예제

#include <limits.h>
#include <stdbit.h>
#include <stdint.h>
#include <stdio.h>
#define bits_num(value) (sizeof(value) * CHAR_BIT)
#define bin_impl(T, suffix) \
const char* bin_##suffix(T x) \
{ \
    static char buf[bits_num(x) * CHAR_BIT + 1]; \
    for (T i = 0, mask = ((T)1 << (bits_num(x) - 1)); mask; mask >>= 1) \
        buf[i++] = x & mask ? '1' : '0'; \
    buf[bits_num(x)] = '\0'; \
    return buf; \
}
bin_impl(uint8_t, u8)
bin_impl(uint16_t, u16)
bin_impl(uint32_t, u32)
bin_impl(uint64_t, u64)
#define bin(x) _Generic((x), \
    uint8_t: bin_u8, uint16_t: bin_u16, uint32_t: bin_u32, default: bin_u64)(x)
int main()
{
    puts("uint8_t:");
    for (uint8_t x = 0b11000000; ; x >>= 1)
    {
        printf("x = [%s], leading zeros: %d\n", bin(x), stdc_leading_zeros(x));
        if (!x)
            break;
    }
    puts("uint16_t:");
    for (uint16_t x = 0b11000000; ; x >>= 1)
    {
        printf("x = [%s], leading zeros: %d\n", bin(x), stdc_leading_zeros(x));
        if (!x)
            break;
    }
}

출력:

uint8_t:
x = [11000000], leading zeros: 0
x = [01100000], leading zeros: 1
x = [00110000], leading zeros: 2
x = [00011000], leading zeros: 3
x = [00001100], leading zeros: 4
x = [00000110], leading zeros: 5
x = [00000011], leading zeros: 6
x = [00000001], leading zeros: 7
x = [00000000], leading zeros: 8
uint16_t:
x = [0000000011000000], leading zeros: 8
x = [0000000001100000], leading zeros: 9
x = [0000000000110000], leading zeros: 10
x = [0000000000011000], leading zeros: 11
x = [0000000000001100], leading zeros: 12
x = [0000000000000110], leading zeros: 13
x = [0000000000000011], leading zeros: 14
x = [0000000000000001], leading zeros: 15
x = [0000000000000000], leading zeros: 16

참고 항목

최상위 비트부터 시작하여 0 비트의 첫 번째 위치를 찾음
(타입-제네릭 함수 매크로)
부호 없는 정수에서 0 비트의 개수를 셈
(타입-제네릭 함수 매크로)
최상위 비트부터 시작하여 연속된 1 비트의 개수를 셈
(타입-제네릭 함수 매크로)
C++ documentation for countl_zero