这个问题不是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?
发布于 2022-11-09 09:14:31
许多处理器提供直接计算前导零位数的指令(例如,x86有lzcnt / bsr,ARM有clz)。通常,C++编译器提供了访问这些指令之一的内在特性。然后,可以使用前导零的数目来计算位长。
在GCC里,内在被称为__builtin_clz。它计算32位整数的前导零数。
然而,关于__builtin_clz有一个警告。当输入为0时,结果是未定义的。因此,我们需要处理这一特殊情况。这是在下面的(x == 0) ? 32 : ...函数中完成的,当x是0时,它会给出结果32
uint32_t count_of_leading_0_bits(const uint32_t &x) {
return (x == 0) ? 32 : __builtin_clz(x);
}然后,可以根据前导零的数目计算位长:
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?。
https://stackoverflow.com/questions/29388711
复制相似问题