(C ++)2 ^ 32 = 0但2 ^ 31 * 2有效

时间:2016-03-29 18:48:41

标签: c++ exponential

所以我最近在c ++中创建了一个简单的计算器,除其他外,它可以计算指数,但它只能工作到2 ^ 31。 这是问题,我的输入/输出如下:

I: 2^31
O: 131072

I: 2^32
O: 0

I: 13107*2
O: 262144

基本上它不能做2 ^ 32但它可以做(2 ^ 31)* 2,我只是无法理解为什么。如果有人可以帮助我解释为什么我会真的很感激它。这是计算指数的代码btw:

long exp(long x, int y) {
  int p;

  if (y % 2 == 0) {
      p = 1;
  }
  else {
      p = x;
  }

  while (y > 1) {
      x *= x;
      y /= 2;
  }
  return x*p;
}

2 个答案:

答案 0 :(得分:3)

即使是小数字,您的功能也会产生错误的结果。 考虑:

std::cout << exp(2,4); // 16
std::cout << exp(2,5); // 32
std::cout << exp(2,6); // 16 ???

首先你需要修复函数的实现,第二个使用能够代表更大数字的更大类型:

long long exp(long long x, int y)
{
    long long result = x;
    while(--y)
    {
        result*=x;
    }
    return result;

}

编辑:注意它只适用于正数。 另请注意,C ++中没有内置的“power operator”。 Operator ^称为XOR运算符,它对两个数字执行按位运算。 注意:

int x = 0b101'111; //47
int y = 0b110'010; //50
//x^y = 0b011'101
std::cout << (x^y); //outputs 29

如果只设置了一对位中的一个,则XOR运算符结果中的每个位都置1,否则为0.

x:      0   1   0   1 
y:      0   0   1   1

result: 0   1   1   0

答案 1 :(得分:0)

通过将“long”变为“long long”,我设法代表2 ^ 32。

人们指出的另一个问题是2 ^ 31是错误的,那是因为我没有考虑到即使 y 启动甚至它也可以在以后成为事实除以2时奇数,然后当你再次潜水2时,它将比它应该减少一个周期。

  

EX:y = 6&gt;&gt; 6/2 = 3&gt; 3/2 = 1

编辑:我设法修复它,如果有人对此感兴趣,那么代码现在看起来如何:

long long exp(long long x, int y) {
  int p = 1;


  while (y > 1) {
      if (y % 2 != 0) {
          p *= x;
      }
      x *= x;
      y /= 2;
  }
  return x*p;
}

从我看到它似乎正在发挥作用。