首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++中获取整数的位长?

如何在C++中获取整数的位长?
EN

Stack Overflow用户
提问于 2015-04-01 10:41:46
回答 5查看 14K关注 0票数 10

这个问题不是Count the number of set bits in a 32-bit integer的翻版。见下文丹尼尔S.的评论。

--

假设有一个变量int x;。其大小为4字节,即32位。

然后我给这个变量赋值x = 4567 (在二进制10001 11010111中),所以在内存中如下所示:

00000000 00000000 00010001 11010111

有没有办法得到重要的比特的长度。在我的例子中,位的长度是13 (我用粗体标记它们)。如果我使用sizeof(x),它返回4,即4个字节,这是整个int的大小。如何获得表示整数所需的最小位数,而不使用前导0s?

EN

Stack Overflow用户

发布于 2022-11-09 09:14:31

许多处理器提供直接计算前导零位数的指令(例如,x86有lzcnt / bsr,ARM有clz)。通常,C++编译器提供了访问这些指令之一的内在特性。然后,可以使用前导零的数目来计算位长。

在GCC里,内在被称为__builtin_clz。它计算32位整数的前导零数。

然而,关于__builtin_clz有一个警告。当输入为0时,结果是未定义的。因此,我们需要处理这一特殊情况。这是在下面的(x == 0) ? 32 : ...函数中完成的,当x0时,它会给出结果32

代码语言:javascript
复制
uint32_t count_of_leading_0_bits(const uint32_t &x) {
    return (x == 0) ? 32 : __builtin_clz(x);
}

然后,可以根据前导零的数目计算位长:

代码语言:javascript
复制
uint32_t bitlen(const uint32_t &x) {
    return 32 - count_of_leading_0_bits(x);
}

请注意,其他C++编译器在计数前导零位数方面有不同的本质,但是您可以通过在互联网上搜索快速找到它们。下面是与MSVC等价的How to use MSVC intrinsics to get the equivalent of this GCC code?

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29388711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档