stdc_leading_zeros
Определено в заголовочном файле <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 ) // exposed interface: generic_return_type stdc_leading_zeros( generic_value_type value ) [[unsequenced]]; | (6) | (начиная с C23) |
1-5) Возвращает количество последовательных битов
6) Обобщённая функция (обозначенная аргументом 0 в value, начиная со старшего бита.generic_value_type) возвращает соответствующее значение в зависимости от типа входного значения, если оно относится к одному из следующих типов: - стандартный беззнаковый целочисленный тип, за исключением bool;
- расширенный беззнаковый целочисленный тип;
- или беззнаковый целочисленный тип с точно заданной разрядностью, ширина которого совпадает со стандартным или расширенным целочисленным типом, за исключением bool.
generic_return_type должен быть подходящим беззнаковым целочисленным типом достаточной разрядности, способным представлять вычисленный результат. Параметры
| value | - | значение беззнакового целочисленного типа |
Возвращаемое значение
Количество последовательных битов 0 в value, начиная со старшего бита.
Пример
#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
См. также
|
(C23) | находит позицию первого бита 0, начиная со старшего бита(обобщённый макрос функции) |
|
(C23) | подсчитывает количество битов 0 в беззнаковом целом числе(обобщённый макрос функции) |
|
(C23) | подсчитывает количество последовательных битов 1, начиная со старшего бита(обобщённый макрос функции) |
Документация по C++ для countl_zero |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/numeric/bit/stdc_leading_zeros