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
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * minus sign "-" followed by a hexadecimal ("0x..." or "#..."), octal
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * ("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 {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
1421f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char firstDigit = string.charAt(i);
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = firstDigit == '-';
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (length == 1) {
1481f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            firstDigit = string.charAt(++i);
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int base = 10;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (firstDigit == '0') {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (++i == length) {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return valueOf(0L);
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (i == length) {
1601f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                    throw invalidLong(string);
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                i++;
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 16;
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 8;
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if (firstDigit == '#') {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (i == length) {
1691f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            i++;
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            base = 16;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = parse(string, i, base, negative);
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(result);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this instance with the specified object and indicates if they
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are equal. In order to be equal, {@code o} must be an instance of
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Long} and have the same long value as this object.
188726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this long with.
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Long}; {@code false} otherwise.
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object o) {
1960d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (o instanceof Long) && (((Long) o).value == value);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns {@code null} if {@code string} is {@code null}
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or empty, if the property can not be found or if its value can not be
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parsed as a long.
209726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or {@code null}.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string) {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
234726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, long defaultValue) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Long} value of the system property identified by
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as a long.
263726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no long system
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            property with the requested name.
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as a {@code Long} or the default
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value.
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long getLong(String string, Long defaultValue) {
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) (value ^ (value >>> 32));
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (int) value;
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this long.
299726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value. The ASCII
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * character \u002d ('-') is recognized as the minus sign.
310726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string}.
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3158890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static long parseLong(String string) throws NumberFormatException {
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseLong(string, 10);
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
324726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive long value represented by {@code string} using
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code radix}.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3328890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
3338890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
3348890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
33682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static long parseLong(String string, int radix) throws NumberFormatException {
3371f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
3381f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw new NumberFormatException("Invalid radix: " + radix);
3391f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        }
3401f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (string == null) {
3411f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
3451f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = string.charAt(i) == '-';
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative && ++i == length) {
3491f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidLong(string);
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parse(string, i, radix, negative);
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35582a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    private static long parse(String string, int offset, int radix, boolean negative) {
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long max = Long.MIN_VALUE / radix;
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        long result = 0, length = string.length();
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (offset < length) {
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int digit = Character.digit(string.charAt(offset++), radix);
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (digit == -1) {
3611f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (max > result) {
3641f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            long next = result * radix - digit;
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (next > result) {
3681f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = next;
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negative) {
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = -result;
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (result < 0) {
3751f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidLong(string);
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its binary string representation.
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of '0' and '1' characters.
389726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
390726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
39282a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes     * @return the binary string representation of {@code v}.
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
394726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toBinaryString(long v) {
39582a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToBinaryString(v);
39682a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    }
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its hexadecimal string
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representation. The returned string is a concatenation of characters from
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * '0' to '9' and 'a' to 'f'.
402726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
403726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code l}.
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
407726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toHexString(long v) {
40882a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToHexString(v);
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its octal string representation.
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of characters from '0' to '7'.
414726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
415726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to convert.
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the octal string representation of {@code l}.
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
419726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toOctalString(long v) {
42082a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToOctalString(v);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Long.toString(value);
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified long value into its decimal string representation.
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of a minus sign if the number is
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * negative and characters from '0' to '9'.
432726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
433726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param n
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to convert.
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the decimal string representation of {@code l}.
436f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
437726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long n) {
43882a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(n);
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
442438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Converts the specified signed long value into a string representation based on
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the specified radix. The returned string is a concatenation of a minus
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * sign if the number is negative and characters from '0' to '9' and 'a' to
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 'z', depending on the radix. If {@code radix} is not in the interval
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * defined by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX}
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * then 10 is used as the base for the conversion.
448f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
449438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>This method treats its argument as signed. If you want to convert an
450438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unsigned value to one of the common non-decimal bases, you may find
451438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
452438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * more convenient.
453726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
454726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
455438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     *            the signed long to convert.
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the base to use for the conversion.
458726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the string representation of {@code v}.
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
460726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(long v, int radix) {
46182a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.longToString(v, radix);
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal long value.
466726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string}.
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
4728890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value.
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String)
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Long valueOf(String string) throws NumberFormatException {
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string));
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed long value using the specified
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix.
482726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of a long value.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Long} instance containing the long value represented by
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string} using {@code radix}.
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
4908890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as a long value, or
4918890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
4928890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseLong(String, int)
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
49582a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes    public static Long valueOf(String string, int radix) throws NumberFormatException {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseLong(string, radix));
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the highest (leftmost) bit of the specified long value that is
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Most Significant 1 Bit. Returns zero if the specified long is
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
504726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
505726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
507726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the highest 1 bit in {@code v}.
508f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long highestOneBit(long v) {
511726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 3-1
512726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 1);
513726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 2);
514726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 4);
515726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 8);
516726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 16);
517726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v |= (v >> 32);
518726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v - (v >>> 1);
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the lowest (rightmost) bit of the specified long value that is
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1 and returns the bit mask value for that bit. This is also referred to
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * as the Least Significant 1 Bit. Returns zero if the specified long is
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
526726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
527726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
529726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the bit mask indicating the lowest 1 bit in {@code v}.
530f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
532726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long lowestOneBit(long v) {
533726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v & -v;
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of leading zeros in the specified long value prior
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to the {@link #highestOneBit(long) highest one bit}.
539f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
540726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
542726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of leading zeros in {@code v}.
543f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
545726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfLeadingZeros(long v) {
546726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // After Hacker's Delight, Figure 5-6
547726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v < 0) {
548726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 0;
549726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
550726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (v == 0) {
551726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return 64;
552726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
553726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // On a 64-bit VM, the two previous tests should probably be replaced by
554726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // if (v <= 0) return ((int) (~v >> 57)) & 64;
555726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
556726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int n = 1;
557726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i = (int) (v >>> 32);
558726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i == 0) {
559726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  32;
560726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i = (int) v;
561726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5629e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 16 == 0) {
563726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  16;
564726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 16;
565726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5669e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 24 == 0) {
567726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  8;
568726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 8;
569726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5709e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 28 == 0) {
571726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  4;
572726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 4;
573726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
5749e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        if (i >>> 30 == 0) {
575726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  2;
576726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 2;
577726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
578726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return n - (i >>> 31);
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of trailing zeros in the specified long value after
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #lowestOneBit(long) lowest one bit}.
584f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
585726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
587726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of trailing zeros in {@code v}.
588f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
590726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int numberOfTrailingZeros(long v) {
591726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int low = (int) v;
592726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return low !=0 ? Integer.numberOfTrailingZeros(low)
593726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch                       : 32 + Integer.numberOfTrailingZeros((int) (v >>> 32));
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Counts the number of 1 bits in the specified long value; this is also
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * referred to as population count.
599f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
600726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long to examine.
602726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the number of 1 bits in {@code v}.
603f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
605726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int bitCount(long v) {
606726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Combines techniques from several sources
607726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        v -=  (v >>> 1) & 0x5555555555555555L;
6089e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = (v & 0x3333333333333333L) + ((v >>> 2) & 0x3333333333333333L);
609726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int i =  ((int)(v >>> 32)) + (int) v;
6109e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        i = (i & 0x0F0F0F0F) + ((i >>> 4) & 0x0F0F0F0F);
611726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 8;
612726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >>> 16;
613726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i  & 0x0000007F;
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
616726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /*
617726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * On a modern 64-bit processor with a fast hardware multiply, this is
618726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * much faster (assuming you're running a 64-bit VM):
619726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
620726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * // http://chessprogramming.wikispaces.com/Population+Count
621726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * int bitCount (long x) {
622726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x -=  (x >>> 1) & 0x5555555555555555L;
623726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
624726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x + (x >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
625726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     x = (x * 0x0101010101010101L) >>> 56;
626726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *     return (int) x;
627726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * }
628726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
629726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * Really modern processors (e.g., Nehalem, K-10) have hardware popcount
630726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * instructions.
631726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
632726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the left by the specified
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of bits.
636f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
637726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate left.
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
642f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
644726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateLeft(long v, int distance) {
645726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
646726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v << distance) | (v >>> -distance);
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified long value to the right by the
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified number of bits.
652f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
653726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to rotate right.
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
658f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
660726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long rotateRight(long v, int distance) {
661726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
662726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (v >>> distance) | (v << -distance);
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bytes of the specified long value.
667726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
668726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the byte order.
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
671f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
673726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverseBytes(long v) {
674726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
675726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
6769e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
6779e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
6789e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bits of the specified long value.
683726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
684726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value for which to reverse the bit order.
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
687f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
689726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static long reverse(long v) {
690726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
691726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
6929e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 1) & 0x5555555555555555L) | ((v & 0x5555555555555555L) << 1);
6939e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 2) & 0x3333333333333333L) | ((v & 0x3333333333333333L) << 2);
6949e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 4) & 0x0F0F0F0F0F0F0F0FL) | ((v & 0x0F0F0F0F0F0F0F0FL) << 4);
6959e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
6969e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
6979e13cc8ad982ba191400889bb8e5248a1933d45eJoshua Bloch        return ((v >>>32)                   ) | ((v                      ) <<32);
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the {@code signum} function for the specified long
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
703726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *
704726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to check.
706726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return -1 if {@code v} is negative, 1 if {@code v} is positive, 0 if
707726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     *         {@code v} is zero.
708f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
710726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static int signum(long v) {
711726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return v < 0 ? -1 : (v == 0 ? 0 : 1);
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Long} instance for the specified long value.
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it is not necessary to get a new {@code Long} instance, it is
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recommended to use this method instead of the constructor, since it
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * maintains a cache of instances which may result in better performance.
720f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
721726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param v
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the long value to store in the instance.
723726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return a {@code Long} instance containing {@code v}.
724f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
726726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static Long valueOf(long v) {
7270d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
730726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
731726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * A cache of instances used by {@link Long#valueOf(long)} and auto-boxing.
732726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
733726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    private static final Long[] SMALL_VALUES = new Long[256];
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
735726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    static {
7360d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        for (int i = -128; i < 128; i++) {
737726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            SMALL_VALUES[i + 128] = new Long(i);
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
741