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 int}.
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.Long
30726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch * @since 1.0
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
320d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes@FindBugsSuppressWarnings("DM_NUMBER_CTOR")
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic final class Integer extends Number implements Comparable<Integer> {
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static final long serialVersionUID = 1360826667806852920L;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
38726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * The int value represented by this Integer
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final int value;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the maximum {@code int} value, 2<sup>31</sup>-1.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MAX_VALUE = 0x7FFFFFFF;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the minimum {@code int} value, -2<sup>31</sup>.
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int MIN_VALUE = 0x80000000;
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constant for the number of bits needed to represent an {@code int} in
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * two's complement form.
55f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
56f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final int SIZE = 32;
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
61726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * Table for Seal's algorithm for Number of Trailing Zeros. Hacker's Delight
62726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * online, Figure 5-18 (http://www.hackersdelight.org/revisions.pdf)
63726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * The entries whose value is -1 are never referenced.
64726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
65171dc20afe5071d5cbfad7103903bfa2c1f8d00fElliott Hughes    private static final byte[] NTZ_TABLE = {
66726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        32,  0,  1, 12,  2,  6, -1, 13,   3, -1,  7, -1, -1, -1, -1, 14,
67726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        10,  4, -1, -1,  8, -1, -1, 25,  -1, -1, -1, -1, -1, 21, 27, 15,
68726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        31, 11,  5, -1, -1, -1, -1, -1,   9, -1, -1, 24, -1, -1, 20, 26,
69726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        30, -1, -1, -1, -1, 23, -1, 19,  29, -1, 22, 18, 28, 17, 16, -1
70726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    };
71f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The {@link Class} object that represents the primitive type {@code int}.
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
76726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static final Class<Integer> TYPE
77726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            = (Class<Integer>) int[].class.getComponentType();
78726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    // Note: Integer.TYPE can't be set to "int.class", since *that* is
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // defined to be "java.lang.Integer.TYPE";
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Integer} with the specified primitive integer
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * value.
84f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param value
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the primitive integer value to store in the new instance.
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Integer(int value) {
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.value = value;
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new {@code Integer} from the specified string.
94f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of an integer value.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
988890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value.
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseInt(String)
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public Integer(String string) throws NumberFormatException {
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this(parseInt(string));
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public byte byteValue() {
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (byte) value;
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this object to the specified integer object to determine their
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * relative order.
113f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param object
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer object to compare this object to.
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a negative value if the value of this integer is less than the
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object}; 0 if the value of this integer and the
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         value of {@code object} are equal; a positive value if the value
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         of this integer is greater than the value of {@code object}.
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see java.lang.Comparable
121f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.2
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int compareTo(Integer object) {
124c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        return compare(value, object.value);
125c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    }
126c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes
127c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    /**
128c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * Compares two {@code int} values.
129c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * @return 0 if lhs = rhs, less than 0 if lhs &lt; rhs, and greater than 0 if lhs &gt; rhs.
130c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * @since 1.7
131c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     * @hide 1.7
132c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes     */
133c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes    public static int compare(int lhs, int rhs) {
134c3adcfb1339de546aed6e7ff00a7edb020b8a85bElliott Hughes        return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1371f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    private static NumberFormatException invalidInt(String s) {
1381f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        throw new NumberFormatException("Invalid int: \"" + s + "\"");
1391f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    }
1401f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string and returns a {@code Integer} instance if the
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * string can be decoded into an integer value. The string may be an
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * optional minus sign "-" followed by a hexadecimal ("0x..." or "#..."),
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * octal ("0..."), or decimal ("...") representation of an integer.
146f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            a string representation of an integer value.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an {@code Integer} containing the value represented by
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code string}.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
1528890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer decode(String string) throws NumberFormatException {
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
1571f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidInt(string);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        char firstDigit = string.charAt(i);
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = firstDigit == '-';
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (length == 1) {
1631f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            firstDigit = string.charAt(++i);
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int base = 10;
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (firstDigit == '0') {
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (++i == length) {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return valueOf(0);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
174f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson                if (++i == length) {
1751f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                    throw invalidInt(string);
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 16;
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } else {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                base = 8;
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } else if (firstDigit == '#') {
182f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson            if (++i == length) {
1831f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            base = 16;
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int result = parse(string, i, base, negative);
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(result);
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public double doubleValue() {
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Compares this instance with the specified object and indicates if they
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * are equal. In order to be equal, {@code o} must be an instance of
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Integer} and have the same integer value as this object.
201f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param o
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the object to compare this integer with.
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the specified object is equal to this
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code Integer}; {@code false} otherwise.
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public boolean equals(Object o) {
2090d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        return (o instanceof Integer) && (((Integer) o).value == value);
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public float floatValue() {
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Integer} value of the system property identified by
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns {@code null} if {@code string} is {@code null}
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * or empty, if the property can not be found or if its value can not be
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parsed as an integer.
222f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as an {@code Integer} or
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null}.
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer getInteger(String string) {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Integer} value of the system property identified by
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as an integer.
248f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no integer
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            system property with the requested name.
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as an {@code Integer} or the
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         default value.
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer getInteger(String string, int defaultValue) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return valueOf(defaultValue);
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Integer} value of the system property identified by
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code string}. Returns the specified default value if {@code string} is
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code null} or empty, if the property can not be found or if its value
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * can not be parsed as an integer.
277f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the requested system property.
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param defaultValue
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the default value that is returned if there is no integer
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            system property with the requested name.
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the requested property's value as an {@code Integer} or the
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         default value.
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer getInteger(String string, Integer defaultValue) {
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (string == null || string.length() == 0) {
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String prop = System.getProperty(string);
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (prop == null) {
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return decode(prop);
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NumberFormatException ex) {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return defaultValue;
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int hashCode() {
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Gets the primitive value of this int.
308f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return this object's primitive value.
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public int intValue() {
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public long longValue() {
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return value;
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 decimal integer value. The ASCII
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * character \u002d ('-') is recognized as the minus sign.
324f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of an integer value.
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive integer value represented by {@code string}.
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3298890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value.
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int parseInt(String string) throws NumberFormatException {
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parseInt(string, 10);
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed integer value using the specified
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
338f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of an integer value.
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the primitive integer value represented by {@code string} using
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code radix}.
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
3468890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value,
3478890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             or {@code radix < Character.MIN_RADIX ||
3488890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3501f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    public static int parseInt(String string, int radix) throws NumberFormatException {
3511f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
3521f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw new NumberFormatException("Invalid radix: " + radix);
3531f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        }
3541f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes        if (string == null) {
3551f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidInt(string);
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int length = string.length(), i = 0;
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (length == 0) {
3591f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidInt(string);
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        boolean negative = string.charAt(i) == '-';
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (negative && ++i == length) {
3631f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes            throw invalidInt(string);
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return parse(string, i, radix, negative);
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
3691f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes    private static int parse(String string, int offset, int radix, boolean negative) throws NumberFormatException {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int max = Integer.MIN_VALUE / radix;
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int result = 0, length = string.length();
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        while (offset < length) {
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int digit = Character.digit(string.charAt(offset++), radix);
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (digit == -1) {
3751f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (max > result) {
3781f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int next = result * radix - digit;
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (next > result) {
3821f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = next;
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!negative) {
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            result = -result;
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (result < 0) {
3891f07ea29bc2d334c55c16227582a7795b8c117c1Elliott Hughes                throw invalidInt(string);
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return result;
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public short shortValue() {
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (short) value;
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified integer into its binary string representation. The
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned string is a concatenation of '0' and '1' characters.
403f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to convert.
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the binary string representation of {@code i}.
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toBinaryString(int i) {
40982a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.intToBinaryString(i);
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified integer into its hexadecimal string
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * representation. The returned string is a concatenation of characters from
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * '0' to '9' and 'a' to 'f'.
416f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to convert.
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the hexadecimal string representation of {@code i}.
420f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toHexString(int i) {
422347b2a604114602da9bc4ae040278f74d11c2f51Brian Carlstrom        return IntegralToString.intToHexString(i, false, 0);
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified integer into its octal string representation. The
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * returned string is a concatenation of characters from '0' to '7'.
428f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to convert.
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the octal string representation of {@code i}.
432f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toOctalString(int i) {
43482a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.intToOctalString(i);
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @Override
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String toString() {
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return Integer.toString(value);
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Converts the specified integer into its decimal string representation.
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The returned string is a concatenation of a minus sign if the number is
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * negative and characters from '0' to '9'.
446f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
447726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @param i
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to convert.
449726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * @return the decimal string representation of {@code i}.
450726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
451726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    public static String toString(int i) {
45282a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.intToString(i);
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
456438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * Converts the specified signed integer into a string representation based on the
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified radix. The returned string is a concatenation of a minus sign
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * if the number is negative and characters from '0' to '9' and 'a' to 'z',
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * depending on the radix. If {@code radix} is not in the interval defined
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX} then 10 is
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used as the base for the conversion.
462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
463438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * <p>This method treats its argument as signed. If you want to convert an
464438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * unsigned value to one of the common non-decimal bases, you may find
465438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
466438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     * more convenient.
467f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
469438d9883775e6ee31c097e2103a25571d2426cd9Elliott Hughes     *            the signed integer to convert.
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the base to use for the conversion.
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the string representation of {@code i}.
473f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     */
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static String toString(int i, int radix) {
47582a495ad44d76aac37f54bbbe7c31608d1054f84Elliott Hughes        return IntegralToString.intToString(i, radix);
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed decimal integer value.
480f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of an integer value.
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an {@code Integer} instance containing the integer value
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         represented by {@code string}.
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
4868890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value.
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseInt(String)
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer valueOf(String string) throws NumberFormatException {
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseInt(string));
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Parses the specified string as a signed integer value using the specified
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * radix.
496f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param string
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the string representation of an integer value.
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param radix
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the radix to use when parsing.
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an {@code Integer} instance containing the integer value
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         represented by {@code string} using {@code radix}.
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NumberFormatException
5048890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             if {@code string} cannot be parsed as an integer value, or
5058890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             {@code radix < Character.MIN_RADIX ||
5068890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes     *             radix > Character.MAX_RADIX}.
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #parseInt(String, int)
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
5098890504f824eca28560987cc23d0b18e8a62bbaaElliott Hughes    public static Integer valueOf(String string, int radix) throws NumberFormatException {
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return valueOf(parseInt(string, radix));
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the highest (leftmost) bit of the specified integer that is 1
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and returns the bit mask value for that bit. This is also referred to as
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the Most Significant 1 Bit. Returns zero if the specified integer is
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * zero.
518f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to examine.
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the bit mask indicating the highest 1 bit in {@code i}.
522f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int highestOneBit(int i) {
525726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 3-1
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i |= (i >> 1);
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i |= (i >> 2);
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i |= (i >> 4);
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i |= (i >> 8);
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i |= (i >> 16);
531726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i - (i >>> 1);
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the lowest (rightmost) bit of the specified integer that is 1
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * and returns the bit mask value for that bit. This is also referred
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * to as the Least Significant 1 Bit. Returns zero if the specified integer
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is zero.
539f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to examine.
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the bit mask indicating the lowest 1 bit in {@code i}.
543f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int lowestOneBit(int i) {
546726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i & -i;
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of leading zeros in the specified integer prior to
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #highestOneBit(int) highest one bit}.
552f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to examine.
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of leading zeros in {@code i}.
556f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int numberOfLeadingZeros(int i) {
559726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 5-6
560726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i <= 0) {
561726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            return (~i >> 26) & 32;
562726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
563726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        int n = 1;
564726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i >> 16 == 0) {
565726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  16;
566726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 16;
567726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
568726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i >> 24 == 0) {
569726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  8;
570726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 8;
571726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
572726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i >> 28 == 0) {
573726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  4;
574726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 4;
575726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
576726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        if (i >> 30 == 0) {
577726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            n +=  2;
578726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            i <<= 2;
579726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        }
580726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return n - (i >>> 31);
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Determines the number of trailing zeros in the specified integer after
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the {@link #lowestOneBit(int) lowest one bit}.
586f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to examine.
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of trailing zeros in {@code i}.
590f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int numberOfTrailingZeros(int i) {
5939c63d8ea5b107c32f947d49242f41b049f227629Elliott Hughes        return NTZ_TABLE[((i & -i) * 0x0450FBAF) >>> 26];
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 integer; this is also
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * referred to as population count.
599f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer to examine.
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of 1 bits in {@code i}.
603f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int bitCount(int i) {
606726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight, Figure 5-2
607726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i -= (i >> 1) & 0x55555555;
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
609726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i = ((i >> 4) + i) & 0x0F0F0F0F;
610726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >> 8;
611726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i += i >> 16;
612726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return i & 0x0000003F;
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified integer to the left by the specified
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of bits.
618f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value to rotate left.
621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
624f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int rotateLeft(int i, int distance) {
627726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 32 (JLS3 15.19), so we needn't mask -distance
628726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (i << distance) | (i >>> -distance);
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Rotates the bits of the specified integer to the right by the specified
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * number of bits.
634f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value to rotate right.
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param distance
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the number of bits to rotate.
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the rotated value.
640f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int rotateRight(int i, int distance) {
643726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Shift distances are mod 32 (JLS3 15.19), so we needn't mask -distance
644726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (i >>> distance) | (i << -distance);
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bytes of the specified integer.
649f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value for which to reverse the byte order.
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
653f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int reverseBytes(int i) {
656726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
657726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
658726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i =    ((i >>>  8) & 0x00FF00FF) | ((i & 0x00FF00FF) <<  8);
659726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return ( i >>> 16              ) | ( i               << 16);
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Reverses the order of the bits of the specified integer.
664f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value for which to reverse the bit order.
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the reversed value.
668f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int reverse(int i) {
671726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // Hacker's Delight 7-1, with minor tweak from Veldmeijer
672726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        // http://graphics.stanford.edu/~seander/bithacks.html
673726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i =    ((i >>>  1) & 0x55555555) | ((i & 0x55555555) <<  1);
674726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i =    ((i >>>  2) & 0x33333333) | ((i & 0x33333333) <<  2);
675726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i =    ((i >>>  4) & 0x0F0F0F0F) | ((i & 0x0F0F0F0F) <<  4);
676726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        i =    ((i >>>  8) & 0x00FF00FF) | ((i & 0x00FF00FF) <<  8);
677726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return ((i >>> 16)             ) | ((i             ) << 16);
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the value of the {@code signum} function for the specified
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * integer.
683f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value to check.
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return -1 if {@code i} is negative, 1 if {@code i} is positive, 0 if
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code i} is zero.
688f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static int signum(int i) {
691726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return (i >> 31) | (-i >>> 31); // Hacker's delight 2-7
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a {@code Integer} instance for the specified integer value.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it is not necessary to get a new {@code Integer} instance, it is
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * recommended to use this method instead of the constructor, since it
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * maintains a cache of instances which may result in better performance.
700f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     *
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param i
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the integer value to store in the instance.
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a {@code Integer} instance containing {@code i}.
704f5597e626ecf7949d249dea08c1a2964d890ec11Jesse Wilson     * @since 1.5
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static Integer valueOf(int i) {
707726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch        return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
710726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    /**
711726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
712726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch     */
713726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    private static final Integer[] SMALL_VALUES = new Integer[256];
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
715726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch    static {
7160d4daefcf389b6433a0af481ef44a84a2546541aElliott Hughes        for (int i = -128; i < 128; i++) {
717726ac583d69b37db03c6279af5b36df7b837ede1Joshua Bloch            SMALL_VALUES[i + 128] = new Integer(i);
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
721