【问题标题】:C++ 64bit integer operation: Can someone explain why this works and the other doesn't?C ++ 64位整数运算:有人可以解释为什么这个有效而另一个无效吗?
【发布时间】:2010-11-11 04:20:36
【问题描述】:

我需要对 64 位整数进行运算。我正在尝试将 36 的结果提高到 12 的幂作为练习(并且作为要求)。

我在我的 VS2008 编译器上使用了 unsigned long long 作为 64 位整数。我已经编写了下面的代码,有人可以向我解释一下,为什么我的 for 循环版本会产生不正确的结果,而我的递归版本的 Power 函数会产生正确的结果?

仅供参考:36 提高到 12 是 4738381338321616896

template< typename _T1, typename _T2 >
_T1 Power( _T1 p_base, _T2 p_power )
{
    /*
    // This produces 0?!!
    if( p_power == 0 ) return 1;
    for( _T2 i = 1; i < p_power; ++i )
    {
        p_base *= p_base;
    }

    return p_base;
    */

    // This produces correct result.
    if( p_power == 0 ) return 1;
    if( p_power == 1 ) return p_base;

    return p_base * Power( p_base, p_power - 1 );
}

void main( int argc, char * argv[] )
{
    unsigned long long charsetSize = 36LL;
    printf( "Maximum Keys: %llu\n\n", Power( charsetSize, 12 ) );

    system( "pause" );
}

【问题讨论】:

  • _T1_T2保留don't use them。就像其他人一样,使用TU

标签: c++ 64-bit multiplication


【解决方案1】:

您在每次迭代时对结果进行平方。它应该是这样的:

_T1 result = 1;
for( _T2 i = 0; i < p_power; ++i )
{
    result *= p_base;
}

注意,如果你这样写循环,p_power == 0 检查是不必要的。

【讨论】:

  • @all:Doh!我忽略了这一点。感谢大家。我期待它是某种 64 位容量或模板参数解析问题,毕竟这是错误的算法! (斗鸡眼)
【解决方案2】:

这是因为您将每次乘法的结果存储在 p_base 中。这可能是导致变量溢出的原因。

您需要分别存储 p_base 的输入值和“工作”变量。根据 for 循环的逻辑,2 的 4 次方是 65536。

【讨论】:

    【解决方案3】:

    p_base *= p_base;

    这是不正确的。每次迭代后结果平方

    修正

    _T1 pow = 1LL;
    for( _T2 i = 1; i <= p_power; ++i )
    {
        pow *= p_base;
    }
    return pow;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多