在c++中计算64位整数的位数时,大输入(64位)会产生意想不到的结果
Big inputs(64 bits) giving unexpected results while Counting number of bits in a 64-bit integer in c++
我试图计数64位整数的位数,但它显示了一些意想不到的。下面是代码。计数位不是主要部分,但一些意想不到的输出是....请看看输入和输出!!!!
#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中的位数)应该只打印一次,控制台应该等待,直到我输入另一个数字并计数其他数字中的位数。但这并没有发生。输出如下所示....
63
63
63
63
63
63
63
63
63
63
除了上述解释如何正确计数位之外,这就是为什么它一直持续到t
耗尽而不要求更多输入的原因:
问题在于您的值的大小:18446744073709551615
大于signed long long
。因此,一旦您将它输入到cin
中,流就不再是good()
: failbit设置:
failbit - Logical error on i/o operation
从这里http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/:
提取和解析字符…把它们理解为……正确的类型………然后(
if good
),……相应地调整流的内部状态标志。
那么,在你的例子中
- 读取第一个值
- 您处理
n
中的任何内容(应该是numeric_limits::max()),忽略任何输入错误 - 你尝试读取下一个值
- 由于设置了failbit,
cin>>n
不做任何事情,使旧的n
保持原样 - 此过程重复直到
t
耗尽
18446744073709551615
, failbit设置。在x86-64上有POPCNT指令。https://en.wikipedia.org/wiki/SSE4 POPCNT_and_LZCNT
https://msdn.microsoft.com/en-us/library/bb385231.aspxunsigned __int64 __popcnt64(
unsigned __int64 value
);
GCC __builtin_popcountll ((long long) x);
相关文章:
- 将应用程序从32位移植到64位时出现问题
- 64位机器上的C++内存对齐
- qmake:检测目标位宽(32 位或 64 位)
- 如何在 64 位 vb.net Windows 应用程序中引用 32 位 dll
- Qt 5.11.2 (Clang 8.0 (Apple), 64 位), 找不到 QJSEngine 文件
- 在 64 位边界上对齐C++结构数组?
- 如何为字符串生成唯一但一致的 N 位哈希(小于 64 位)?
- 在 64 位的 c++ 中运行 mstest 测试
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 浮点数为 32 位和 64 位二进制表示形式
- 是否有 64 位等效于 GetLastInputInfo / LASTINPUTINFO?
- 所有可能的链接生成器与64位密钥
- WinAPI C++如何从 64 位应用程序加载资源
- 在 c++ 中输出 64 位整数
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 如何在 64 位平台上计算 32 位哈希C++?
- 使用 Murmur2 64 位哈希函数生成会导致冲突的输入
- 输入64位数字
- 在具有 64 位 CPU 的 32 位 Win8 上运行 32 位 Orwell Dev-C++ - 输入指针返回不正确
- 在c++中计算64位整数的位数时,大输入(64位)会产生意想不到的结果