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