11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2011 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * in compliance with the License. You may obtain a copy of the License at
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software distributed under the
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * express or implied. See the License for the specific language governing permissions and
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.primitives;
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkArgument;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull;
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
217dd252788645e940eada959bdde927426e2531c9Paul Duffin
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
257dd252788645e940eada959bdde927426e2531c9Paul Duffinimport javax.annotation.CheckReturnValue;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A wrapper class for unsigned {@code long} values, supporting arithmetic operations.
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>In some cases, when speed is more important than code readability, it may be faster simply to
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * treat primitive {@code long} values as unsigned, using the methods from {@link UnsignedLongs}.
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
347dd252788645e940eada959bdde927426e2531c9Paul Duffin * <p>See the Guava User Guide article on <a href=
357dd252788645e940eada959bdde927426e2531c9Paul Duffin * "http://code.google.com/p/guava-libraries/wiki/PrimitivesExplained#Unsigned_support">
367dd252788645e940eada959bdde927426e2531c9Paul Duffin * unsigned primitive utilities</a>.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Colin Evans
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(serializable = true)
437dd252788645e940eada959bdde927426e2531c9Paul Duffinpublic final class UnsignedLong extends Number implements Comparable<UnsignedLong>, Serializable {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final long UNSIGNED_MASK = 0x7fffffffffffffffL;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedLong ZERO = new UnsignedLong(0);
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedLong ONE = new UnsignedLong(1);
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static final UnsignedLong MAX_VALUE = new UnsignedLong(-1L);
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private final long value;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
537dd252788645e940eada959bdde927426e2531c9Paul Duffin  private UnsignedLong(long value) {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.value = value;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
587dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns an {@code UnsignedLong} corresponding to a given bit representation.
597dd252788645e940eada959bdde927426e2531c9Paul Duffin   * The argument is interpreted as an unsigned 64-bit value. Specifically, the sign bit
607dd252788645e940eada959bdde927426e2531c9Paul Duffin   * of {@code bits} is interpreted as a normal bit, and all other bits are treated as usual.
617dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
627dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>If the argument is nonnegative, the returned result will be equal to {@code bits},
637dd252788645e940eada959bdde927426e2531c9Paul Duffin   * otherwise, the result will be equal to {@code 2^64 + bits}.
647dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * <p>To represent decimal constants less than {@code 2^63}, consider {@link #valueOf(long)}
667dd252788645e940eada959bdde927426e2531c9Paul Duffin   * instead.
677dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
687dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
697dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
707dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static UnsignedLong fromLongBits(long bits) {
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    // TODO(user): consider caching small values, like Long.valueOf
727dd252788645e940eada959bdde927426e2531c9Paul Duffin    return new UnsignedLong(bits);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
767dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns an {@code UnsignedLong} representing the same value as the specified {@code long}.
777dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
787dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @throws IllegalArgumentException if {@code value} is negative
797dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
807dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
817dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static UnsignedLong valueOf(long value) {
820888a09821a98ac0680fad765217302858e70fa4Paul Duffin    checkArgument(value >= 0,
830888a09821a98ac0680fad765217302858e70fa4Paul Duffin        "value (%s) is outside the range for an unsigned long value", value);
847dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(value);
857dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
867dd252788645e940eada959bdde927426e2531c9Paul Duffin
877dd252788645e940eada959bdde927426e2531c9Paul Duffin  /**
887dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns a {@code UnsignedLong} representing the same value as the specified
897dd252788645e940eada959bdde927426e2531c9Paul Duffin   * {@code BigInteger}. This is the inverse operation of {@link #bigIntegerValue()}.
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code value} is negative or {@code value >= 2^64}
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(BigInteger value) {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(value);
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument(value.signum() >= 0 && value.bitLength() <= Long.SIZE,
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned long value", value);
977dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(value.longValue());
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedLong} holding the value of the specified {@code String}, parsed as
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * an unsigned {@code long} value.
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code long}
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(String string) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return valueOf(string, 10);
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedLong} holding the value of the specified {@code String}, parsed as
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * an unsigned {@code long} value in the specified radix.
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code long}
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value, or {@code radix} is not between {@link Character#MIN_RADIX} and
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         {@link Character#MAX_RADIX}
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(String string, int radix) {
1207dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(UnsignedLongs.parseUnsignedLong(string, radix));
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of adding this and {@code val}. If the result would have more than 64 bits,
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 64 bits of the result.
1267dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1277dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1287dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1297dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedLong plus(UnsignedLong val) {
1307dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(this.value + checkNotNull(val).value);
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1347dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns the result of subtracting this and {@code val}. If the result would have more than 64
1357dd252788645e940eada959bdde927426e2531c9Paul Duffin   * bits, returns the low 64 bits of the result.
1367dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1377dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1387dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1397dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedLong minus(UnsignedLong val) {
1407dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(this.value - checkNotNull(val).value);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of multiplying this and {@code val}. If the result would have more than 64
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bits, returns the low 64 bits of the result.
1467dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1477dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1487dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1497dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1507dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedLong times(UnsignedLong val) {
1517dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(value * checkNotNull(val).value);
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of dividing this by {@code val}.
1567dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1577dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1587dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1597dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1607dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedLong dividedBy(UnsignedLong val) {
1617dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(UnsignedLongs.divide(value, checkNotNull(val).value));
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1657dd252788645e940eada959bdde927426e2531c9Paul Duffin   * Returns this modulo {@code val}.
1667dd252788645e940eada959bdde927426e2531c9Paul Duffin   *
1677dd252788645e940eada959bdde927426e2531c9Paul Duffin   * @since 14.0
1687dd252788645e940eada959bdde927426e2531c9Paul Duffin   */
1697dd252788645e940eada959bdde927426e2531c9Paul Duffin  @CheckReturnValue
1707dd252788645e940eada959bdde927426e2531c9Paul Duffin  public UnsignedLong mod(UnsignedLong val) {
1717dd252788645e940eada959bdde927426e2531c9Paul Duffin    return fromLongBits(UnsignedLongs.remainder(value, checkNotNull(val).value));
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as an {@code int}.
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int intValue() {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (int) value;
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code long}. This is an inverse operation
1840888a09821a98ac0680fad765217302858e70fa4Paul Duffin   * to {@link #fromLongBits}.
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that if this {@code UnsignedLong} holds a value {@code >= 2^63}, the returned value
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be equal to {@code this - 2^64}.
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public long longValue() {
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code float}, analogous to a widening
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code long} to {@code float}, and correctly rounded.
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public float floatValue() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("cast")
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    float fValue = (float) (value & UNSIGNED_MASK);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fValue += 0x1.0p63f;
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return fValue;
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code double}, analogous to a widening
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code long} to {@code double}, and correctly rounded.
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public double doubleValue() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("cast")
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    double dValue = (double) (value & UNSIGNED_MASK);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      dValue += 0x1.0p63;
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return dValue;
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@link BigInteger}.
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public BigInteger bigIntegerValue() {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BigInteger bigInt = BigInteger.valueOf(value & UNSIGNED_MASK);
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      bigInt = bigInt.setBit(Long.SIZE - 1);
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return bigInt;
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2330888a09821a98ac0680fad765217302858e70fa4Paul Duffin  @Override
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int compareTo(UnsignedLong o) {
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(o);
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.compare(value, o.value);
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int hashCode() {
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Longs.hashCode(value);
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean equals(@Nullable Object obj) {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (obj instanceof UnsignedLong) {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      UnsignedLong other = (UnsignedLong) obj;
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value == other.value;
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedLong} value, in base 10.
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString() {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.toString(value);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedLong} value, in base {@code radix}. If
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code radix < Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}, the radix
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code 10} is used.
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString(int radix) {
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.toString(value, radix);
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
270