stdc_leading_zeros
来自cppreference.com
| 在标头 <stdbit.h> 定义
|
||
| |
(1) | (C23 起) |
| |
(2) | (C23 起) |
| |
(3) | (C23 起) |
| |
(4) | (C23 起) |
| |
(5) | (C23 起) |
| |
(6) | (C23 起) |
1-5) 返回
value 中从最高有效位开始的连续 0 位的个数。6) 泛型函数(以
generic_value_type 实参标记),基于输入值的类型返回适当的值,要求类型为:
- 不包括
bool的标准无符号整数类型; - 扩充无符号整数类型;
- 或者,宽度与某个非
bool标准或扩充整数类型匹配的位精确无符号整数类型。
generic_return_type 应当是足以表示计算结果的适当大小的无符号整数类型。参数
| value | - | 无符号整数 |
返回值
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], 前导零: %d\n", bin(x), stdc_leading_zeros(x));
if (!x)
break;
}
puts("uint16_t:");
for (uint16_t x = 0b11000000; ; x >>= 1)
{
printf("x = [%s], 前导零: %d\n", bin(x), stdc_leading_zeros(x));
if (!x)
break;
}
}
输出:
uint8_t:
x = [11000000], 前导零: 0
x = [01100000], 前导零: 1
x = [00110000], 前导零: 2
x = [00011000], 前导零: 3
x = [00001100], 前导零: 4
x = [00000110], 前导零: 5
x = [00000011], 前导零: 6
x = [00000001], 前导零: 7
x = [00000000], 前导零: 8
uint16_t:
x = [0000000011000000], 前导零: 8
x = [0000000001100000], 前导零: 9
x = [0000000000110000], 前导零: 10
x = [0000000000011000], 前导零: 11
x = [0000000000001100], 前导零: 12
x = [0000000000000110], 前导零: 13
x = [0000000000000011], 前导零: 14
x = [0000000000000001], 前导零: 15
x = [0000000000000000], 前导零: 16
参阅
从最高有效位开始,查找第一个为 0 的位的位置(泛型函数宏) | |
(C23) |
计算在无符号整数中为 0 的位的数量(泛型函数宏) |
(C23) |
从最高有效位开始,计算连续为 1 的位的个数(泛型函数宏) |
countl_zero 的 C++ 文档
| |