c++ - 什么是 std::__lg?

标签 c++ std

作为标题我不知道 std::__lg 是什么意思在谷歌之后?这行到底是做什么的:int n = std::__lg(block_sz - pos_l + 1);

最佳答案

它有助于计算整数的基于 2 的对数,即它返回数字中最高设置位的索引(或 -1 表示 0)。

即对于 1 它将返回 0,对于 16 它将返回 4,对于 1024 它将返回 10,等等。

这可用于有效地预测数组的预分配大小,四舍五入到最接近的 2 的幂等。

请注意,与任何其他以 __ 开头的函数一样,它是编译器或库的内部函数,因此您不应依赖它的存在,这样的代码将不可移植。 std 库的其他实现可以带有完整的解决方案和类似助手的不同名称(如果它们使用完全相似的东西)。

POSIX 提供了类似的功能 - ffs() ,还有 ffsl 和 ffsll(参见同一页),它们是 GNU 扩展,分别与 long 和 long long 一起工作。

对于评论中的问题——如何从 Java 中使用它。由于上述原因,首先这不是一个好主意,其次它需要 JNI 包装器。第三但也是最重要的——实际上没有理由这样做。 Java已经提供了类似的方法Integer.heghestOneBit() ,尽管注意它与描述的 std::__lg 相比返回 +1,即 0 表示 0,1 表示 1,11 表示 1024,等等。

关于c++ - 什么是 std::__lg?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40434664/

相关文章:

c++ - 为什么在不需要时使用这么多宏

c++ - 为什么需要内存对齐?

c++ - 在树中找到一个节点并替换为具有更新私有(private)成员的新节点

c++ - 迭代器的类型 C++

C++ "extra"头文件

c++ - 重新定位 vector 的一部分

c++ - "cout << cout"- 输出代表什么?

c++ - std::aligned_storage 的目的是什么?

c++ - 为什么 C++14 中没有 std::allocate_unique 函数?

c++ - 配合Core-Audio使用RtAudio,probeDeviceOpen函数失败