C++ 如何计算O(1)中的二进制长度?

C++ 如何计算O(1)中的二进制长度?,c++,performance,binary,big-o,bit,C++,Performance,Binary,Big O,Bit,通常,我必须将std::string中的整数转换为二进制,然后使用std::string::size()方法获取二进制数的长度 因此100给出了“1100100”(长度为7) 但这是一个O(n)算法(至少),我正在编写一个需要大量位计数的性能密集型程序。是否有任何算法可以让我们知道任何给定“二进制”数的长度,而不必在瞬间将该数转换为std::string?谢谢。您正在计算二进制对数。有许多方法可以做到这一点,如上所述 一种简单的方法是使用查找表。首先,在启动时制作一个查找表: LogTable2

通常,我必须将std::string中的整数转换为二进制,然后使用std::string::size()方法获取二进制数的长度

因此100给出了“1100100”(长度为7


但这是一个O(n)算法(至少),我正在编写一个需要大量位计数的性能密集型程序。是否有任何算法可以让我们知道任何给定“二进制”数的长度,而不必在瞬间将该数转换为std::string?谢谢。

您正在计算二进制对数。有许多方法可以做到这一点,如上所述

一种简单的方法是使用查找表。首先,在启动时制作一个查找表:

LogTable256[0] = LogTable256[1] = 0;
for (int i = 2; i != 256; i++) {
    LogTable256[i] = 1 + LogTable256[i / 2];
}
LogTable256[0] = -1; // if you want log(0) to return -1
现在您可以按如下方式使用它:

if (tt = v >> 24) {
    r = 24 + LogTable256[tt];
} else if (tt = v >> 16) {
    r = 16 + LogTable256[tt];
} else if (tt = v >> 8) {
    r = 8 + LogTable256[tt];
} else {
    r = LogTable256[v];
}

下面是我的一行回答,但这取决于机器中如何实现
log2()

length = ceil(log2(number))

O(1)
O(log(N))
?您可以使用
ceil(log2(100))
获取
7
。问题是我不知道计算
log2
的复杂度是多少。它可能不是O(n),但完全不是O(1)。int32_t countBinaryLength(int32_t n){std::string r;do{r=(n%2==0?“0”:“1”)+r;n/=2;}while(n!=0);return r.size();}这对有限n有效,不是吗?在这种情况下是32位?@vsoftco是的,这个限制为32位。我们可以通过“更多的相同”将其扩展到64位。是的,我更多地考虑了任意精度的数字。在这种情况下,我认为没有任何
O(1)
算法。虽然我很确定OP在这里处理的是固定大小的数字,但这是一个很好的答案!我已经试过了,但是你的方法返回6。怎么了?因为OP正在查找字符串的长度,
LogTable256
的初始值应该是1,而不是0。如果数字是2,则返回1,而长度实际上是2。@Anand ahh这是真的。也许更好的答案是ceil(log2(number))+(0.0==log2(number))。正确的答案是floor(log2(number))+1