1 いらね。あと破壊的に使ったおかげで変数 i もいらね。
2 の部分:

  for (ans = 1; y > 0; y >>= 1) {
    if (y & 1) ans *= x;
    x *= x;
  }

計算量は O(log n)。