大输入(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.
所以,在你的情况下
- 您读取了第一个值
18446744073709551615
,已设置故障位。
- 你处理
n
中的任何内容(应该是 numeric_limits::max()),忽略任何输入错误
- 您尝试读取下一个值
- 因为设置了 failbit
cin>>n
什么都不做,让旧的 n
保持原样
- 重复此过程直到
t
筋疲力尽
我正在尝试计算 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.
所以,在你的情况下
- 您读取了第一个值
18446744073709551615
,已设置故障位。 - 你处理
n
中的任何内容(应该是 numeric_limits::max()),忽略任何输入错误 - 您尝试读取下一个值
- 因为设置了 failbit
cin>>n
什么都不做,让旧的n
保持原样 - 重复此过程直到
t
筋疲力尽