toString(opt_radix) {
    var radix = opt_radix || 10;
    if (radix < 2 || 36 < radix) {
      throw new Error('radix out of range: ' + radix);
    }

    // We can avoid very expensive division based code path for some common
    // cases.
    if (this.isSafeInteger()) {
      var asNumber = this.toNumber();
      // Shortcutting for radix 10 (common case) to avoid boxing via toString:
      // https://jsperf.com/tostring-vs-vs-if
      return radix == 10 ? ('' + asNumber) : asNumber.toString(radix);
    }

    // We need to split 64bit integer into: `a * radix**safeDigits + b` where
    // neither `a` nor `b` exceeds 53 bits, meaning that safeDigits can be any
    // number in a range: [(63 - 53) / log2(radix); 53 / log2(radix)].

    // Other options that need to be benchmarked:
    //   11..16 - (radix >> 2);
    //   10..13 - (radix >> 3);
    //   10..11 - (radix >> 4);
    var safeDigits = 14 - (radix >> 2);

    var radixPowSafeDigits = Math.pow(radix, safeDigits);
    var radixToPower =
        Long.fromBits(radixPowSafeDigits, radixPowSafeDigits / TWO_PWR_32_DBL_);

    var remDiv = this.div(radixToPower);
    var val = Math.abs(this.subtract(remDiv.multiply(radixToPower)).toNumber());
    var digits = radix == 10 ? ('' + val) : val.toString(radix);

    if (digits.length < safeDigits) {
      // Up to 13 leading 0s we might need to insert as the greatest safeDigits
      // value is 14 (for radix 2).
      digits = '0000000000000'.slice(digits.length - safeDigits) + digits;
    }

    val = remDiv.toNumber();
    return (radix == 10 ? val : val.toString(radix)) + digits;
  }
@param {number=} opt_radix The radix in which the text should be written.
@return {string} The textual representation of this value.
@override