大输入(64 位)在计算 C++ 中的 64 位整数中的位数时给出意想不到的结果

Big inputs(64 bits) giving unexpected results while Counting number of bits in a 64-bit integer in c++

我正在尝试计算 64 位整数中的位数,但它显示一些 unexpected.here 是代码。 计数位不是主要部分,但一些意外的输出是....请查看输入和输出!!!!

#include<iostream>
#include<math.h>
#include<stdint.h>
#include<cstdio>
using namespace std;

int64_t t,n,ans;
int main(){
    cin>>t;
    while(t--){
         int64_t ans=0;
         cin>>n;
         /*
         while(n>0LL){
             n>>=1LL;
             ans++;
         }//*/
        ans=floor(log2(n));
        //ans=floor(log2l(n));
        cout<<ans<<"\n";

    }
    return 0;
}

输入输出是这样的

10
18446744073709551615

63(18446744073709551615 中的位数)应该只打印一次,控制台应该等到我输入另一个数字并计算其他 number.but 中的位数,它不是 happening.The输出是这样的....

63
63
63
63
63
63
63
63
63
63

请帮我解决这个问题。

在 x86-64 上有 POPCNT 指令。 https://en.wikipedia.org/wiki/SSE4#POPCNT_and_LZCNT

https://msdn.microsoft.com/en-us/library/bb385231.aspx

unsigned __int64 __popcnt64(
   unsigned __int64 value
);

海湾合作委员会

__builtin_popcountll ((long long) x);

除了上述解释如何正确计数位之外,这就是为什么它一直持续到 t 耗尽而不要求更多输入的原因:

问题在于您的值的大小:18446744073709551615

大于signed long long。因此,一旦您将其输入 cin 中,流就变成了 not good():failbit is set:

failbit - Logical error on i/o operation

从这里 http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/ :

Extracts and parses characters ... interpret them as ... the proper type... ...Then (if good), ...adjusting the stream's internal state flags accordingly.

所以,在你的情况下

  1. 您读取了第一个值 18446744073709551615,已设置故障位。
  2. 你处理 n 中的任何内容(应该是 numeric_limits::max()),忽略任何输入错误
  3. 您尝试读取下一个值
  4. 因为设置了 failbit cin>>n 什么都不做,让旧的 n 保持原样
  5. 重复此过程直到 t 筋疲力尽