【问题标题】:Why can't my C++ algorithm handle integers more than 62 bits?为什么我的 C++ 算法不能处理超过 62 位的整数?
【发布时间】:2016-02-07 00:00:57
【问题描述】:

我在玩 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 的 Code::Blocks,在由 Intel Core i5-4570 Haswell CPU 提供支持的 Windows 10 64 位上运行。

【问题讨论】:

  • long long 已签名,因此至少可以解释“缺失”位之一 - 符号位。

标签: c++ algorithm integer long-integer


【解决方案1】:

因为 1 位是符号位,所以剩下 63 个“有用”位......并且您的算法试图找到大于输入数字的 2 的幂,因此您的最大输入数字只能是 62位,以便您的 2 次方可以高 1 到 63 位。

【讨论】:

  • 他可以让它无符号以提供额外的精度吗?
  • 我没有仔细查看代码是否会破坏其他任何内容,但是,是的,他通常应该能够通过无符号获得额外的一点。
  • 使用无符号整数有效。我现在得到高达 2^65-1 的正确结果。之后每个数字都返回 '64',但简单的 'if' 可以处理它。
猜你喜欢
  • 2022-01-12
  • 2021-04-15
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 2022-11-23
  • 2010-10-05
  • 1970-01-01
相关资源
最近更新 更多