为什么我的C++算法不能处理超过 62 位的整数?
Why can't my C++ algorithm handle integers more than 62 bits?
我正在玩弄C++,并决定编写返回给定整数位长度的算法。在解决了一些不相关的问题后,它终于奏效了。这是我的代码:
#include <iostream>
using namespace std;
long long int ipow(int x,int n)
{
if (n==0) return 1;
if (n%2!=0) return x*ipow(x,((n-1)/2))*ipow(x,((n-1)/2));
return ipow(x,n/2)*ipow(x,n/2);
}
int bits(long long int n)
{
if (n==0 || n==1) return 1;
int i=1;
while (n>ipow(2,i+1)-1) i++;
return i+1;
}
int main()
{
long long int n;
cin>>n;
cout<<bits(n)<<endl;
}
我已经用越来越大的数字测试了它,并发现了有趣的事实 - 程序对于大多数整数来说都非常快,甚至更大(50-60 位长(,但卡在高 CPU 负载下并且几分钟内没有显示任何数字"有点"大。
我稍微修改了代码以找到断点,发现我的程序可以处理的最后一个整数是4611686018427387903。我在 Wolfram Alpha 上查找了它,发现它等于 2^63-1,这意味着它是最大的 62 位数字。
有我的问题 - 这可能是愚蠢的 - 为什么是 62 位?据我了解,long long int 可以容纳 64 位变量,我的 CPU 也可以处理 64 位整数。那么为什么 64 位不是限制呢?
-马特乌什·杜哈尔斯基
PS 我正在使用代码::块与最新的稳定 MinGW 运行在由英特尔酷睿 i5-4570 Haswell CPU 驱动的 Windows 10 64 位上运行。
因为 1 位是符号位,所以剩下 63 个"有用"位......并且您的算法试图找到大于输入数的 2 次幂,因此您的最大输入数只能是 62 位,因此您的 2 次幂可以高 1 位到 63 位。
相关文章:
- 如何反转整数参数包
- enum是C++中的宏变量还是整数变量
- 努力将整数转换为链表。不知道我在这里做错了什么
- 整数不会重复超过随机数
- 在C++中手动调整数组大小
- 检查输入是否不是整数或数字
- C++使用整数的压缩数组初始化对象
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将"打开的CV图像"中的"颜色"转换为整数格式
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何只允许用户输入正整数
- 如何在c++中从文本文件中逐行读取整数
- C++:如何循环通过向量中的整数元素
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 序列化,没有库的整数,得到奇怪的结果
- 在一定长度后从数组中打印时缺少整数
- std::当在256字节边界上写入整数时,流的奇怪行为
- 内联程序集printf将整数解释为地址
- 是否基于数组B整数打印数组A中的整数
- 如何在C++中将整数转换为其数字数组