1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.lang;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The wrapper for the primitive type {@code long}.
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
23726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * Implementation note: The "bit twiddling" methods in this class use techniques
24726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * described in <a href="http://www.hackersdelight.org/">Henry S. Warren,
25726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * Jr.'s Hacker's Delight, (Addison Wesley, 2002)</a> and <a href=
26726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * "http://graphics.stanford.edu/~seander/bithacks.html">Sean Anderson's
27726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * Bit Twiddling Hacks.</a>
28f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson *
29726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * @see java.lang.Integer
30f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson * @since 1.0
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
320d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes@FindBugsSuppressWarnings("DM_NUMBER_CTOR")
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Long extends Number implements Comparable<Long> {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 4290774380558885855L;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The value which the receiver represents.
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final long value;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the maximum {@code long} value, 2<sup>63</sup>-1.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final long MAX_VALUE = 0x7FFFFFFFFFFFFFFFL;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the minimum {@code long} value, -2<sup>63</sup>.
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final long MIN_VALUE = 0x8000000000000000L;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@link Class} object that represents the primitive type {@code long}.
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
56726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static final Class<Long> TYPE
57726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            = (Class<Long>) long[].class.getComponentType();
58726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    // Note: Long.TYPE can't be set to "long.class", since *that* is
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // defined to be "java.lang.Long.TYPE";
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the number of bits needed to represent a {@code long} in
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * two's complement form.
64f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
65f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SIZE = 64;
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Long} with the specified primitive long value.
71726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive long value to store in the new instance.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Long(long value) {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = value;
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Long} from the specified string.
81726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
858890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String)
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Long(String string) throws NumberFormatException {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(parseLong(string));
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte byteValue() {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (byte) value;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this object to the specified long object to determine their
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * relative order.
100726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long object to compare this object to.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if the value of this long is less than the value
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of {@code object}; 0 if the value of this long and the value of
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code object} are equal; a positive value if the value of this
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         long is greater than the value of {@code object}.
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Comparable
108f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Long object) {
111c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        return compare(value, object.value);
112c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    }
113c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes
114c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    /**
115c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * Compares two {@code long} values.
116c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * @return 0 if lhs = rhs, less than 0 if lhs &lt; rhs, and greater than 0 if lhs &gt; rhs.
117c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * @since 1.7
118c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     */
119c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    public static int compare(long lhs, long rhs) {
120c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1231f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    private static NumberFormatException invalidLong(String s) {
1241f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        throw new NumberFormatException("Invalid long: \"" + s + "\"");
1251f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    }
1261f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string and returns a {@code Long} instance if the
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string can be decoded into a long value. The string may be an optional
1306b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * optional sign character ("-" or "+") followed by a hexadecimal ("0x..."
1316b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * or "#..."), octal ("0..."), or decimal ("...") representation of a long.
132726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a string representation of a long value.
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} containing the value represented by {@code string}.
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
1378890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long decode(String string) throws NumberFormatException {
1406b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        int length = string.length();
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
1421f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1446b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle
1456b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        int i = 0;
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char firstDigit = string.charAt(i);
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = firstDigit == '-';
1486b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        if (negative || firstDigit == '+') {
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (length == 1) {
1501f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            firstDigit = string.charAt(++i);
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int base = 10;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (firstDigit == '0') {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (++i == length) {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return valueOf(0L);
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i == length) {
1621f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                    throw invalidLong(string);
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i++;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 16;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 8;
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if (firstDigit == '#') {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (i == length) {
1711f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i++;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            base = 16;
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = parse(string, i, base, negative);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(result);
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this instance with the specified object and indicates if they
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are equal. In order to be equal, {@code o} must be an instance of
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Long} and have the same long value as this object.
190726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this long with.
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long}; {@code false} otherwise.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object o) {
1980d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (o instanceof Long) && (((Long) o).value == value);
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns {@code null} if {@code string} is {@code null}
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or empty, if the property can not be found or if its value can not be
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parsed as a long.
211726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or {@code null}.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string) {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
236726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, long defaultValue) {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
265726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, Long defaultValue) {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) (value ^ (value >>> 32));
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this long.
301726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value. The ASCII
3116b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * characters \u002d ('-') and \u002b ('+') are recognized as the minus and
3126b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * plus signs.
313726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string}.
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3188890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static long parseLong(String string) throws NumberFormatException {
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseLong(string, 10);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
3266b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * radix. The ASCII characters \u002d ('-') and \u002b ('+') are recognized
3276b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle     * as the minus and plus signs.
328726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string} using
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code radix}.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3368890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
3378890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
3388890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
34082a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static long parseLong(String string, int radix) throws NumberFormatException {
3411f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
3421f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw new NumberFormatException("Invalid radix: " + radix);
3431f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        }
3446b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        if (string == null || string.isEmpty()) {
3451f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3476b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        char firstChar = string.charAt(0);
3486b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        int firstDigitIndex = (firstChar == '-' || firstChar == '+') ? 1 : 0;
3496b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        if (firstDigitIndex == string.length()) {
3501f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3536b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        return parse(string, firstDigitIndex, radix, firstChar == '-');
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    private static long parse(String string, int offset, int radix, boolean negative) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long max = Long.MIN_VALUE / radix;
3586b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        long result = 0;
3596b40837ee3a023bba698c38fd6d6e46ae0065a55Calin Juravle        int length = string.length();
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (offset < length) {
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int digit = Character.digit(string.charAt(offset++), radix);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (digit == -1) {
3631f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (max > result) {
3661f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long next = result * radix - digit;
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (next > result) {
3701f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = next;
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negative) {
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = -result;
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (result < 0) {
3771f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
383ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    /**
384ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * Equivalent to {@code parsePositiveLong(string, 10)}.
385ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     *
386ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * @see #parsePositiveLong(String, int)
387ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     *
388ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * @hide
389ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     */
390ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    public static long parsePositiveLong(String string) throws NumberFormatException {
391ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        return parsePositiveLong(string, 10);
392ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    }
393ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
394ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    /**
395ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * Parses the specified string as a positive long value using the
396ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * specified radix. 0 is considered a positive long.
397ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * <p>
398ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * This method behaves the same as {@link #parseLong(String, int)} except
399ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * that it disallows leading '+' and '-' characters. See that method for
400ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * error conditions.
401ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     *
402ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * @see #parseLong(String, int)
403ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     *
404ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     * @hide
405ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle     */
406ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    public static long parsePositiveLong(String string, int radix) throws NumberFormatException {
407ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
408ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            throw new NumberFormatException("Invalid radix: " + radix);
409ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        }
410ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        if (string == null || string.length() == 0) {
411ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle            throw invalidLong(string);
412ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        }
413ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle        return parse(string, 0, radix, false);
414ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle    }
415ae6e60bf18b455b1134b8b57a56b37cc588e179dCalin Juravle
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its binary string representation.
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of '0' and '1' characters.
424726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
425726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
42782a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes     * @return the binary string representation of {@code v}.
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toBinaryString(long v) {
43082a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToBinaryString(v);
43182a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    }
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its hexadecimal string
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representation. The returned string is a concatenation of characters from
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * '0' to '9' and 'a' to 'f'.
437726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
438726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code l}.
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
442726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toHexString(long v) {
44382a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToHexString(v);
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its octal string representation.
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of characters from '0' to '7'.
449726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
450726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the octal string representation of {@code l}.
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
454726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toOctalString(long v) {
45582a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToOctalString(v);
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Long.toString(value);
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its decimal string representation.
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of a minus sign if the number is
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * negative and characters from '0' to '9'.
467726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
468726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param n
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to convert.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the decimal string representation of {@code l}.
471f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
472726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long n) {
47382a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(n);
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
477438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Converts the specified signed long value into a string representation based on
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified radix. The returned string is a concatenation of a minus
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sign if the number is negative and characters from '0' to '9' and 'a' to
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 'z', depending on the radix. If {@code radix} is not in the interval
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX}
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then 10 is used as the base for the conversion.
483f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
484438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>This method treats its argument as signed. If you want to convert an
485438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unsigned value to one of the common non-decimal bases, you may find
486438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
487438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * more convenient.
488726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
489726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
490438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     *            the signed long to convert.
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the base to use for the conversion.
493726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the string representation of {@code v}.
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
495726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long v, int radix) {
49682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(v, radix);
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value.
501726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string}.
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
5078890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String)
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long valueOf(String string) throws NumberFormatException {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string));
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix.
517726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string} using {@code radix}.
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
5258890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
5268890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
5278890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String, int)
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53082a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static Long valueOf(String string, int radix) throws NumberFormatException {
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string, radix));
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the highest (leftmost) bit of the specified long value that is
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Most Significant 1 Bit. Returns zero if the specified long is
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
539726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
540726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
542726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the highest 1 bit in {@code v}.
543f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
545726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long highestOneBit(long v) {
546726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 3-1
547726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 1);
548726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 2);
549726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 4);
550726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 8);
551726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 16);
552726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 32);
553726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v - (v >>> 1);
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the lowest (rightmost) bit of the specified long value that is
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Least Significant 1 Bit. Returns zero if the specified long is
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
561726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
562726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
564726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the lowest 1 bit in {@code v}.
565f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
567726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long lowestOneBit(long v) {
568726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v & -v;
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of leading zeros in the specified long value prior
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link #highestOneBit(long) highest one bit}.
574f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
575726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
577726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of leading zeros in {@code v}.
578f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
580726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfLeadingZeros(long v) {
581726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // After Hacker's Delight, Figure 5-6
582726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v < 0) {
583726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 0;
584726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
585726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v == 0) {
586726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 64;
587726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
588726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // On a 64-bit VM, the two previous tests should probably be replaced by
589726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // if (v <= 0) return ((int) (~v >> 57)) & 64;
590726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
591726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int n = 1;
592726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i = (int) (v >>> 32);
593726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i == 0) {
594726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  32;
595726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i = (int) v;
596726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5979e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 16 == 0) {
598726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  16;
599726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 16;
600726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
6019e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 24 == 0) {
602726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  8;
603726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 8;
604726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
6059e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 28 == 0) {
606726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  4;
607726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 4;
608726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
6099e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 30 == 0) {
610726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  2;
611726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 2;
612726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
613726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return n - (i >>> 31);
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of trailing zeros in the specified long value after
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #lowestOneBit(long) lowest one bit}.
619f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
620726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
622726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of trailing zeros in {@code v}.
623f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
625726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfTrailingZeros(long v) {
626726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int low = (int) v;
627726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return low !=0 ? Integer.numberOfTrailingZeros(low)
628726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch                       : 32 + Integer.numberOfTrailingZeros((int) (v >>> 32));
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Counts the number of 1 bits in the specified long value; this is also
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * referred to as population count.
634f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
635726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
637726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of 1 bits in {@code v}.
638f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
640726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int bitCount(long v) {
641726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Combines techniques from several sources
642726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v -=  (v >>> 1) & 0x5555555555555555L;
6439e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = (v & 0x3333333333333333L) + ((v >>> 2) & 0x3333333333333333L);
644726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i =  ((int)(v >>> 32)) + (int) v;
6459e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        i = (i & 0x0F0F0F0F) + ((i >>> 4) & 0x0F0F0F0F);
646726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 8;
647726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 16;
648726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i  & 0x0000007F;
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
651726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /*
652726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * On a modern 64-bit processor with a fast hardware multiply, this is
653726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * much faster (assuming you're running a 64-bit VM):
654726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
655726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * // http://chessprogramming.wikispaces.com/Population+Count
656726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * int bitCount (long x) {
657726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x -=  (x >>> 1) & 0x5555555555555555L;
658726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
659726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x + (x >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
660726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x * 0x0101010101010101L) >>> 56;
661726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     return (int) x;
662726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * }
663726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
664726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * Really modern processors (e.g., Nehalem, K-10) have hardware popcount
665726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * instructions.
666726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
667726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the left by the specified
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of bits.
671f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
672726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate left.
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
677f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
679726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateLeft(long v, int distance) {
680726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
681726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v << distance) | (v >>> -distance);
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the right by the
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified number of bits.
687f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
688726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate right.
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
693f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
695726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateRight(long v, int distance) {
696726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
697726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v >>> distance) | (v << -distance);
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bytes of the specified long value.
702726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
703726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the byte order.
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
706f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
708726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverseBytes(long v) {
709726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
710726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
7119e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
7129e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
7139e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bits of the specified long value.
718726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
719726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the bit order.
721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
722f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
724726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverse(long v) {
725726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
726726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
7279e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 1) & 0x5555555555555555L) | ((v & 0x5555555555555555L) << 1);
7289e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 2) & 0x3333333333333333L) | ((v & 0x3333333333333333L) << 2);
7299e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 4) & 0x0F0F0F0F0F0F0F0FL) | ((v & 0x0F0F0F0F0F0F0F0FL) << 4);
7309e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
7319e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
7329e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the {@code signum} function for the specified long
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
738726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
739726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to check.
741726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return -1 if {@code v} is negative, 1 if {@code v} is positive, 0 if
742726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *         {@code v} is zero.
743f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
745726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int signum(long v) {
746726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v < 0 ? -1 : (v == 0 ? 0 : 1);
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Long} instance for the specified long value.
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it is not necessary to get a new {@code Long} instance, it is
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recommended to use this method instead of the constructor, since it
754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * maintains a cache of instances which may result in better performance.
755f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
756726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to store in the instance.
758726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return a {@code Long} instance containing {@code v}.
759f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
761726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static Long valueOf(long v) {
7620d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
765726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
766726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * A cache of instances used by {@link Long#valueOf(long)} and auto-boxing.
767726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
768726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    private static final Long[] SMALL_VALUES = new Long[256];
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
770726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    static {
7710d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        for (int i = -128; i < 128; i++) {
772726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            SMALL_VALUES[i + 128] = new Long(i);
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
776