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
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.math.BigInteger;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport javax.annotation.Nullable;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
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 *
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Please do not extend this class; it will be made final in the near future.</b>
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Louis Wasserman
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Colin Evans
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 11.0
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@Beta
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(serializable = true)
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class UnsignedLong extends Number implements Comparable<UnsignedLong>, Serializable {
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO(user): make final as soon as util.UnsignedLong is migrated over
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
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  protected UnsignedLong(long value) {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    this.value = value;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedLong} that, when treated as signed, is equal to {@code value}. The
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * inverse operation is {@link #longValue()}.
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Put another way, if {@code value} is negative, the returned result will be equal to
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code 2^64 + value}; otherwise, the returned result will be equal to {@code value}.
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong asUnsigned(long value) {
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new UnsignedLong(value);
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a {@code UnsignedLong} representing the same value as the specified {@code BigInteger}
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * . This is the inverse operation of {@link #bigIntegerValue()}.
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws IllegalArgumentException if {@code value} is negative or {@code value >= 2^64}
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(BigInteger value) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(value);
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkArgument(value.signum() >= 0 && value.bitLength() <= Long.SIZE,
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "value (%s) is outside the range for an unsigned long value", value);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(value.longValue());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedLong} holding the value of the specified {@code String}, parsed as
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * an unsigned {@code long} value.
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code long}
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(String string) {
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return valueOf(string, 10);
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns an {@code UnsignedLong} holding the value of the specified {@code String}, parsed as
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * an unsigned {@code long} value in the specified radix.
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * @throws NumberFormatException if the string does not contain a parsable unsigned {@code long}
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         value, or {@code radix} is not between {@link Character#MIN_RADIX} and
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *         {@link Character#MAX_RADIX}
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static UnsignedLong valueOf(String string, int radix) {
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedLongs.parseUnsignedLong(string, radix));
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of adding this and {@code val}. If the result would have more than 64 bits,
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 64 bits of the result.
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedLong add(UnsignedLong val) {
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(this.value + val.value);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of subtracting this and {@code val}. If the result would be negative,
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * returns the low 64 bits of the result.
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedLong subtract(UnsignedLong val) {
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(this.value - val.value);
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of multiplying this and {@code val}. If the result would have more than 64
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bits, returns the low 64 bits of the result.
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedLong multiply(UnsignedLong val) {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(value * val.value);
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the result of dividing this by {@code val}.
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedLong divide(UnsignedLong val) {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedLongs.divide(value, val.value));
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the remainder of dividing this by {@code val}.
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public UnsignedLong remainder(UnsignedLong val) {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(val);
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return asUnsigned(UnsignedLongs.remainder(value, val.value));
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as an {@code int}.
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int intValue() {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return (int) value;
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code long}. This is an inverse operation
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * to {@link #asUnsigned}.
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   *
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * <p>Note that if this {@code UnsignedLong} holds a value {@code >= 2^63}, the returned value
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * will be equal to {@code this - 2^64}.
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public long longValue() {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return value;
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code float}, analogous to a widening
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code long} to {@code float}, and correctly rounded.
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public float floatValue() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("cast")
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    float fValue = (float) (value & UNSIGNED_MASK);
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fValue += 0x1.0p63f;
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return fValue;
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@code double}, analogous to a widening
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * primitive conversion from {@code long} to {@code double}, and correctly rounded.
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public double doubleValue() {
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("cast")
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    double dValue = (double) (value & UNSIGNED_MASK);
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      dValue += 0x1.0p63;
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return dValue;
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the value of this {@code UnsignedLong} as a {@link BigInteger}.
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public BigInteger bigIntegerValue() {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    BigInteger bigInt = BigInteger.valueOf(value & UNSIGNED_MASK);
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (value < 0) {
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      bigInt = bigInt.setBit(Long.SIZE - 1);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return bigInt;
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int compareTo(UnsignedLong o) {
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkNotNull(o);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.compare(value, o.value);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public int hashCode() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Longs.hashCode(value);
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public boolean equals(@Nullable Object obj) {
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    if (obj instanceof UnsignedLong) {
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      UnsignedLong other = (UnsignedLong) obj;
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return value == other.value;
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return false;
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedLong} value, in base 10.
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @Override
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString() {
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.toString(value);
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns a string representation of the {@code UnsignedLong} value, in base {@code radix}. If
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code radix < Character.MIN_RADIX} or {@code radix > Character.MAX_RADIX}, the radix
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code 10} is used.
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public String toString(int radix) {
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return UnsignedLongs.toString(value, radix);
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
243