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     * @hide 1.7
119c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     */
120c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    public static int compare(long lhs, long rhs) {
121c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1241f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    private static NumberFormatException invalidLong(String s) {
1251f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        throw new NumberFormatException("Invalid long: \"" + s + "\"");
1261f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    }
1271f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string and returns a {@code Long} instance if the
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string can be decoded into a long value. The string may be an optional
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * minus sign "-" followed by a hexadecimal ("0x..." or "#..."), octal
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ("0..."), or decimal ("...") representation of a long.
133726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a string representation of a long value.
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} containing the value represented by {@code string}.
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
1388890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long decode(String string) throws NumberFormatException {
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
1431f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char firstDigit = string.charAt(i);
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = firstDigit == '-';
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (length == 1) {
1491f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            firstDigit = string.charAt(++i);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int base = 10;
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (firstDigit == '0') {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (++i == length) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return valueOf(0L);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i == length) {
1611f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                    throw invalidLong(string);
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i++;
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 16;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 8;
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if (firstDigit == '#') {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (i == length) {
1701f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i++;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            base = 16;
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = parse(string, i, base, negative);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(result);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this instance with the specified object and indicates if they
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are equal. In order to be equal, {@code o} must be an instance of
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Long} and have the same long value as this object.
189726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this long with.
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long}; {@code false} otherwise.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object o) {
1970d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (o instanceof Long) && (((Long) o).value == value);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns {@code null} if {@code string} is {@code null}
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or empty, if the property can not be found or if its value can not be
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parsed as a long.
210726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or {@code null}.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
235726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, long defaultValue) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
264726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, Long defaultValue) {
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) (value ^ (value >>> 32));
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this long.
300726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value. The ASCII
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * character \u002d ('-') is recognized as the minus sign.
311726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string}.
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3168890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static long parseLong(String string) throws NumberFormatException {
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseLong(string, 10);
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
325726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string} using
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code radix}.
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3338890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
3348890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
3358890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
33782a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static long parseLong(String string, int radix) throws NumberFormatException {
3381f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
3391f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw new NumberFormatException("Invalid radix: " + radix);
3401f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        }
3411f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (string == null) {
3421f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
3461f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = string.charAt(i) == '-';
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative && ++i == length) {
3501f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parse(string, i, radix, negative);
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;
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = 0, length = string.length();
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (offset < length) {
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int digit = Character.digit(string.charAt(offset++), radix);
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (digit == -1) {
3621f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (max > result) {
3651f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long next = result * radix - digit;
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (next > result) {
3691f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = next;
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negative) {
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = -result;
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (result < 0) {
3761f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its binary string representation.
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of '0' and '1' characters.
390726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
391726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
39382a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes     * @return the binary string representation of {@code v}.
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
395726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toBinaryString(long v) {
39682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToBinaryString(v);
39782a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    }
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its hexadecimal string
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representation. The returned string is a concatenation of characters from
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * '0' to '9' and 'a' to 'f'.
403726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
404726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code l}.
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
408726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toHexString(long v) {
40982a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToHexString(v);
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its octal string representation.
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of characters from '0' to '7'.
415726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
416726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the octal string representation of {@code l}.
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
420726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toOctalString(long v) {
42182a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToOctalString(v);
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Long.toString(value);
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its decimal string representation.
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of a minus sign if the number is
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * negative and characters from '0' to '9'.
433726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
434726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param n
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to convert.
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the decimal string representation of {@code l}.
437f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
438726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long n) {
43982a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(n);
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
443438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Converts the specified signed long value into a string representation based on
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified radix. The returned string is a concatenation of a minus
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sign if the number is negative and characters from '0' to '9' and 'a' to
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 'z', depending on the radix. If {@code radix} is not in the interval
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX}
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then 10 is used as the base for the conversion.
449f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
450438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>This method treats its argument as signed. If you want to convert an
451438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unsigned value to one of the common non-decimal bases, you may find
452438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
453438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * more convenient.
454726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
455726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
456438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     *            the signed long to convert.
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the base to use for the conversion.
459726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the string representation of {@code v}.
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
461726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long v, int radix) {
46282a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(v, radix);
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value.
467726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string}.
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
4738890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String)
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long valueOf(String string) throws NumberFormatException {
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string));
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix.
483726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string} using {@code radix}.
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
4918890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
4928890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
4938890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String, int)
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
49682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static Long valueOf(String string, int radix) throws NumberFormatException {
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string, radix));
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the highest (leftmost) bit of the specified long value that is
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Most Significant 1 Bit. Returns zero if the specified long is
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
505726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
506726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
508726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the highest 1 bit in {@code v}.
509f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
511726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long highestOneBit(long v) {
512726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 3-1
513726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 1);
514726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 2);
515726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 4);
516726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 8);
517726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 16);
518726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 32);
519726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v - (v >>> 1);
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the lowest (rightmost) bit of the specified long value that is
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Least Significant 1 Bit. Returns zero if the specified long is
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
527726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
528726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
530726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the lowest 1 bit in {@code v}.
531f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
533726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long lowestOneBit(long v) {
534726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v & -v;
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of leading zeros in the specified long value prior
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link #highestOneBit(long) highest one bit}.
540f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
541726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
543726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of leading zeros in {@code v}.
544f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
546726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfLeadingZeros(long v) {
547726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // After Hacker's Delight, Figure 5-6
548726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v < 0) {
549726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 0;
550726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
551726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v == 0) {
552726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 64;
553726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
554726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // On a 64-bit VM, the two previous tests should probably be replaced by
555726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // if (v <= 0) return ((int) (~v >> 57)) & 64;
556726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
557726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int n = 1;
558726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i = (int) (v >>> 32);
559726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i == 0) {
560726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  32;
561726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i = (int) v;
562726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5639e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 16 == 0) {
564726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  16;
565726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 16;
566726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5679e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 24 == 0) {
568726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  8;
569726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 8;
570726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5719e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 28 == 0) {
572726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  4;
573726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 4;
574726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5759e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 30 == 0) {
576726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  2;
577726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 2;
578726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
579726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return n - (i >>> 31);
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of trailing zeros in the specified long value after
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #lowestOneBit(long) lowest one bit}.
585f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
586726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
588726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of trailing zeros in {@code v}.
589f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
591726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfTrailingZeros(long v) {
592726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int low = (int) v;
593726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return low !=0 ? Integer.numberOfTrailingZeros(low)
594726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch                       : 32 + Integer.numberOfTrailingZeros((int) (v >>> 32));
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Counts the number of 1 bits in the specified long value; this is also
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * referred to as population count.
600f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
601726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
603726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of 1 bits in {@code v}.
604f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
606726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int bitCount(long v) {
607726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Combines techniques from several sources
608726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v -=  (v >>> 1) & 0x5555555555555555L;
6099e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = (v & 0x3333333333333333L) + ((v >>> 2) & 0x3333333333333333L);
610726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i =  ((int)(v >>> 32)) + (int) v;
6119e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        i = (i & 0x0F0F0F0F) + ((i >>> 4) & 0x0F0F0F0F);
612726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 8;
613726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 16;
614726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i  & 0x0000007F;
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
617726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /*
618726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * On a modern 64-bit processor with a fast hardware multiply, this is
619726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * much faster (assuming you're running a 64-bit VM):
620726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
621726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * // http://chessprogramming.wikispaces.com/Population+Count
622726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * int bitCount (long x) {
623726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x -=  (x >>> 1) & 0x5555555555555555L;
624726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
625726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x + (x >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
626726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x * 0x0101010101010101L) >>> 56;
627726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     return (int) x;
628726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * }
629726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
630726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * Really modern processors (e.g., Nehalem, K-10) have hardware popcount
631726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * instructions.
632726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
633726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the left by the specified
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of bits.
637f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
638726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate left.
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
643f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
645726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateLeft(long v, int distance) {
646726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
647726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v << distance) | (v >>> -distance);
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the right by the
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified number of bits.
653f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
654726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate right.
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
659f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
661726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateRight(long v, int distance) {
662726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
663726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v >>> distance) | (v << -distance);
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bytes of the specified long value.
668726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
669726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the byte order.
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
672f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
674726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverseBytes(long v) {
675726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
676726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
6779e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
6789e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
6799e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bits of the specified long value.
684726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
685726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the bit order.
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
688f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
690726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverse(long v) {
691726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
692726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
6939e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 1) & 0x5555555555555555L) | ((v & 0x5555555555555555L) << 1);
6949e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 2) & 0x3333333333333333L) | ((v & 0x3333333333333333L) << 2);
6959e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 4) & 0x0F0F0F0F0F0F0F0FL) | ((v & 0x0F0F0F0F0F0F0F0FL) << 4);
6969e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
6979e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
6989e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the {@code signum} function for the specified long
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
704726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
705726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to check.
707726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return -1 if {@code v} is negative, 1 if {@code v} is positive, 0 if
708726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *         {@code v} is zero.
709f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
711726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int signum(long v) {
712726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v < 0 ? -1 : (v == 0 ? 0 : 1);
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Long} instance for the specified long value.
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it is not necessary to get a new {@code Long} instance, it is
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recommended to use this method instead of the constructor, since it
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * maintains a cache of instances which may result in better performance.
721f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
722726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to store in the instance.
724726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return a {@code Long} instance containing {@code v}.
725f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
727726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static Long valueOf(long v) {
7280d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
731726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
732726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * A cache of instances used by {@link Long#valueOf(long)} and auto-boxing.
733726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
734726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    private static final Long[] SMALL_VALUES = new Long[256];
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
736726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    static {
7370d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        for (int i = -128; i < 128; i++) {
738726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            SMALL_VALUES[i + 128] = new Long(i);
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
742