• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package java.lang;
19 
20 /**
21  * The wrapper for the primitive type {@code long}.
22  * <p>
23  * Implementation note: The "bit twiddling" methods in this class use techniques
24  * described in <a href="http://www.hackersdelight.org/">Henry S. Warren,
25  * Jr.'s Hacker's Delight, (Addison Wesley, 2002)</a> and <a href=
26  * "http://graphics.stanford.edu/~seander/bithacks.html">Sean Anderson's
27  * Bit Twiddling Hacks.</a>
28  *
29  * @see java.lang.Integer
30  * @since 1.0
31  */
32 @FindBugsSuppressWarnings("DM_NUMBER_CTOR")
33 public final class Long extends Number implements Comparable<Long> {
34 
35     private static final long serialVersionUID = 4290774380558885855L;
36 
37     /**
38      * The value which the receiver represents.
39      */
40     private final long value;
41 
42     /**
43      * Constant for the maximum {@code long} value, 2<sup>63</sup>-1.
44      */
45     public static final long MAX_VALUE = 0x7FFFFFFFFFFFFFFFL;
46 
47     /**
48      * Constant for the minimum {@code long} value, -2<sup>63</sup>.
49      */
50     public static final long MIN_VALUE = 0x8000000000000000L;
51 
52     /**
53      * The {@link Class} object that represents the primitive type {@code long}.
54      */
55     @SuppressWarnings("unchecked")
56     public static final Class<Long> TYPE
57             = (Class<Long>) long[].class.getComponentType();
58     // Note: Long.TYPE can't be set to "long.class", since *that* is
59     // defined to be "java.lang.Long.TYPE";
60 
61     /**
62      * Constant for the number of bits needed to represent a {@code long} in
63      * two's complement form.
64      *
65      * @since 1.5
66      */
67     public static final int SIZE = 64;
68 
69     /**
70      * Constructs a new {@code Long} with the specified primitive long value.
71      *
72      * @param value
73      *            the primitive long value to store in the new instance.
74      */
Long(long value)75     public Long(long value) {
76         this.value = value;
77     }
78 
79     /**
80      * Constructs a new {@code Long} from the specified string.
81      *
82      * @param string
83      *            the string representation of a long value.
84      * @throws NumberFormatException
85      *             if {@code string} cannot be parsed as a long value.
86      * @see #parseLong(String)
87      */
Long(String string)88     public Long(String string) throws NumberFormatException {
89         this(parseLong(string));
90     }
91 
92     @Override
byteValue()93     public byte byteValue() {
94         return (byte) value;
95     }
96 
97     /**
98      * Compares this object to the specified long object to determine their
99      * relative order.
100      *
101      * @param object
102      *            the long object to compare this object to.
103      * @return a negative value if the value of this long is less than the value
104      *         of {@code object}; 0 if the value of this long and the value of
105      *         {@code object} are equal; a positive value if the value of this
106      *         long is greater than the value of {@code object}.
107      * @see java.lang.Comparable
108      * @since 1.2
109      */
compareTo(Long object)110     public int compareTo(Long object) {
111         return compare(value, object.value);
112     }
113 
114     /**
115      * Compares two {@code long} values.
116      * @return 0 if lhs = rhs, less than 0 if lhs &lt; rhs, and greater than 0 if lhs &gt; rhs.
117      * @since 1.7
118      * @hide 1.7
119      */
compare(long lhs, long rhs)120     public static int compare(long lhs, long rhs) {
121         return lhs < rhs ? -1 : (lhs == rhs ? 0 : 1);
122     }
123 
invalidLong(String s)124     private static NumberFormatException invalidLong(String s) {
125         throw new NumberFormatException("Invalid long: \"" + s + "\"");
126     }
127 
128     /**
129      * Parses the specified string and returns a {@code Long} instance if the
130      * string can be decoded into a long value. The string may be an optional
131      * minus sign "-" followed by a hexadecimal ("0x..." or "#..."), octal
132      * ("0..."), or decimal ("...") representation of a long.
133      *
134      * @param string
135      *            a string representation of a long value.
136      * @return a {@code Long} containing the value represented by {@code string}.
137      * @throws NumberFormatException
138      *             if {@code string} cannot be parsed as a long value.
139      */
decode(String string)140     public static Long decode(String string) throws NumberFormatException {
141         int length = string.length(), i = 0;
142         if (length == 0) {
143             throw invalidLong(string);
144         }
145         char firstDigit = string.charAt(i);
146         boolean negative = firstDigit == '-';
147         if (negative) {
148             if (length == 1) {
149                 throw invalidLong(string);
150             }
151             firstDigit = string.charAt(++i);
152         }
153 
154         int base = 10;
155         if (firstDigit == '0') {
156             if (++i == length) {
157                 return valueOf(0L);
158             }
159             if ((firstDigit = string.charAt(i)) == 'x' || firstDigit == 'X') {
160                 if (i == length) {
161                     throw invalidLong(string);
162                 }
163                 i++;
164                 base = 16;
165             } else {
166                 base = 8;
167             }
168         } else if (firstDigit == '#') {
169             if (i == length) {
170                 throw invalidLong(string);
171             }
172             i++;
173             base = 16;
174         }
175 
176         long result = parse(string, i, base, negative);
177         return valueOf(result);
178     }
179 
180     @Override
doubleValue()181     public double doubleValue() {
182         return value;
183     }
184 
185     /**
186      * Compares this instance with the specified object and indicates if they
187      * are equal. In order to be equal, {@code o} must be an instance of
188      * {@code Long} and have the same long value as this object.
189      *
190      * @param o
191      *            the object to compare this long with.
192      * @return {@code true} if the specified object is equal to this
193      *         {@code Long}; {@code false} otherwise.
194      */
195     @Override
equals(Object o)196     public boolean equals(Object o) {
197         return (o instanceof Long) && (((Long) o).value == value);
198     }
199 
200     @Override
floatValue()201     public float floatValue() {
202         return value;
203     }
204 
205     /**
206      * Returns the {@code Long} value of the system property identified by
207      * {@code string}. Returns {@code null} if {@code string} is {@code null}
208      * or empty, if the property can not be found or if its value can not be
209      * parsed as a long.
210      *
211      * @param string
212      *            the name of the requested system property.
213      * @return the requested property's value as a {@code Long} or {@code null}.
214      */
getLong(String string)215     public static Long getLong(String string) {
216         if (string == null || string.length() == 0) {
217             return null;
218         }
219         String prop = System.getProperty(string);
220         if (prop == null) {
221             return null;
222         }
223         try {
224             return decode(prop);
225         } catch (NumberFormatException ex) {
226             return null;
227         }
228     }
229 
230     /**
231      * Returns the {@code Long} value of the system property identified by
232      * {@code string}. Returns the specified default value if {@code string} is
233      * {@code null} or empty, if the property can not be found or if its value
234      * can not be parsed as a long.
235      *
236      * @param string
237      *            the name of the requested system property.
238      * @param defaultValue
239      *            the default value that is returned if there is no long system
240      *            property with the requested name.
241      * @return the requested property's value as a {@code Long} or the default
242      *         value.
243      */
getLong(String string, long defaultValue)244     public static Long getLong(String string, long defaultValue) {
245         if (string == null || string.length() == 0) {
246             return valueOf(defaultValue);
247         }
248         String prop = System.getProperty(string);
249         if (prop == null) {
250             return valueOf(defaultValue);
251         }
252         try {
253             return decode(prop);
254         } catch (NumberFormatException ex) {
255             return valueOf(defaultValue);
256         }
257     }
258 
259     /**
260      * Returns the {@code Long} value of the system property identified by
261      * {@code string}. Returns the specified default value if {@code string} is
262      * {@code null} or empty, if the property can not be found or if its value
263      * can not be parsed as a long.
264      *
265      * @param string
266      *            the name of the requested system property.
267      * @param defaultValue
268      *            the default value that is returned if there is no long system
269      *            property with the requested name.
270      * @return the requested property's value as a {@code Long} or the default
271      *         value.
272      */
getLong(String string, Long defaultValue)273     public static Long getLong(String string, Long defaultValue) {
274         if (string == null || string.length() == 0) {
275             return defaultValue;
276         }
277         String prop = System.getProperty(string);
278         if (prop == null) {
279             return defaultValue;
280         }
281         try {
282             return decode(prop);
283         } catch (NumberFormatException ex) {
284             return defaultValue;
285         }
286     }
287 
288     @Override
hashCode()289     public int hashCode() {
290         return (int) (value ^ (value >>> 32));
291     }
292 
293     @Override
intValue()294     public int intValue() {
295         return (int) value;
296     }
297 
298     /**
299      * Gets the primitive value of this long.
300      *
301      * @return this object's primitive value.
302      */
303     @Override
longValue()304     public long longValue() {
305         return value;
306     }
307 
308     /**
309      * Parses the specified string as a signed decimal long value. The ASCII
310      * character \u002d ('-') is recognized as the minus sign.
311      *
312      * @param string
313      *            the string representation of a long value.
314      * @return the primitive long value represented by {@code string}.
315      * @throws NumberFormatException
316      *             if {@code string} cannot be parsed as a long value.
317      */
parseLong(String string)318     public static long parseLong(String string) throws NumberFormatException {
319         return parseLong(string, 10);
320     }
321 
322     /**
323      * Parses the specified string as a signed long value using the specified
324      * radix. The ASCII character \u002d ('-') is recognized as the minus sign.
325      *
326      * @param string
327      *            the string representation of a long value.
328      * @param radix
329      *            the radix to use when parsing.
330      * @return the primitive long value represented by {@code string} using
331      *         {@code radix}.
332      * @throws NumberFormatException
333      *             if {@code string} cannot be parsed as a long value, or
334      *             {@code radix < Character.MIN_RADIX ||
335      *             radix > Character.MAX_RADIX}.
336      */
parseLong(String string, int radix)337     public static long parseLong(String string, int radix) throws NumberFormatException {
338         if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) {
339             throw new NumberFormatException("Invalid radix: " + radix);
340         }
341         if (string == null) {
342             throw invalidLong(string);
343         }
344         int length = string.length(), i = 0;
345         if (length == 0) {
346             throw invalidLong(string);
347         }
348         boolean negative = string.charAt(i) == '-';
349         if (negative && ++i == length) {
350             throw invalidLong(string);
351         }
352 
353         return parse(string, i, radix, negative);
354     }
355 
parse(String string, int offset, int radix, boolean negative)356     private static long parse(String string, int offset, int radix, boolean negative) {
357         long max = Long.MIN_VALUE / radix;
358         long result = 0, length = string.length();
359         while (offset < length) {
360             int digit = Character.digit(string.charAt(offset++), radix);
361             if (digit == -1) {
362                 throw invalidLong(string);
363             }
364             if (max > result) {
365                 throw invalidLong(string);
366             }
367             long next = result * radix - digit;
368             if (next > result) {
369                 throw invalidLong(string);
370             }
371             result = next;
372         }
373         if (!negative) {
374             result = -result;
375             if (result < 0) {
376                 throw invalidLong(string);
377             }
378         }
379         return result;
380     }
381 
382     @Override
shortValue()383     public short shortValue() {
384         return (short) value;
385     }
386 
387     /**
388      * Converts the specified long value into its binary string representation.
389      * The returned string is a concatenation of '0' and '1' characters.
390      *
391      * @param v
392      *            the long value to convert.
393      * @return the binary string representation of {@code v}.
394      */
toBinaryString(long v)395     public static String toBinaryString(long v) {
396         return IntegralToString.longToBinaryString(v);
397     }
398 
399     /**
400      * Converts the specified long value into its hexadecimal string
401      * representation. The returned string is a concatenation of characters from
402      * '0' to '9' and 'a' to 'f'.
403      *
404      * @param v
405      *            the long value to convert.
406      * @return the hexadecimal string representation of {@code l}.
407      */
toHexString(long v)408     public static String toHexString(long v) {
409         return IntegralToString.longToHexString(v);
410     }
411 
412     /**
413      * Converts the specified long value into its octal string representation.
414      * The returned string is a concatenation of characters from '0' to '7'.
415      *
416      * @param v
417      *            the long value to convert.
418      * @return the octal string representation of {@code l}.
419      */
toOctalString(long v)420     public static String toOctalString(long v) {
421         return IntegralToString.longToOctalString(v);
422     }
423 
424     @Override
toString()425     public String toString() {
426         return Long.toString(value);
427     }
428 
429     /**
430      * Converts the specified long value into its decimal string representation.
431      * The returned string is a concatenation of a minus sign if the number is
432      * negative and characters from '0' to '9'.
433      *
434      * @param n
435      *            the long to convert.
436      * @return the decimal string representation of {@code l}.
437      */
toString(long n)438     public static String toString(long n) {
439         return IntegralToString.longToString(n);
440     }
441 
442     /**
443      * Converts the specified signed long value into a string representation based on
444      * the specified radix. The returned string is a concatenation of a minus
445      * sign if the number is negative and characters from '0' to '9' and 'a' to
446      * 'z', depending on the radix. If {@code radix} is not in the interval
447      * defined by {@code Character.MIN_RADIX} and {@code Character.MAX_RADIX}
448      * then 10 is used as the base for the conversion.
449      *
450      * <p>This method treats its argument as signed. If you want to convert an
451      * unsigned value to one of the common non-decimal bases, you may find
452      * {@link #toBinaryString}, {@code #toHexString}, or {@link #toOctalString}
453      * more convenient.
454      *
455      * @param v
456      *            the signed long to convert.
457      * @param radix
458      *            the base to use for the conversion.
459      * @return the string representation of {@code v}.
460      */
toString(long v, int radix)461     public static String toString(long v, int radix) {
462         return IntegralToString.longToString(v, radix);
463     }
464 
465     /**
466      * Parses the specified string as a signed decimal long value.
467      *
468      * @param string
469      *            the string representation of a long value.
470      * @return a {@code Long} instance containing the long value represented by
471      *         {@code string}.
472      * @throws NumberFormatException
473      *             if {@code string} cannot be parsed as a long value.
474      * @see #parseLong(String)
475      */
valueOf(String string)476     public static Long valueOf(String string) throws NumberFormatException {
477         return valueOf(parseLong(string));
478     }
479 
480     /**
481      * Parses the specified string as a signed long value using the specified
482      * radix.
483      *
484      * @param string
485      *            the string representation of a long value.
486      * @param radix
487      *            the radix to use when parsing.
488      * @return a {@code Long} instance containing the long value represented by
489      *         {@code string} using {@code radix}.
490      * @throws NumberFormatException
491      *             if {@code string} cannot be parsed as a long value, or
492      *             {@code radix < Character.MIN_RADIX ||
493      *             radix > Character.MAX_RADIX}.
494      * @see #parseLong(String, int)
495      */
valueOf(String string, int radix)496     public static Long valueOf(String string, int radix) throws NumberFormatException {
497         return valueOf(parseLong(string, radix));
498     }
499 
500     /**
501      * Determines the highest (leftmost) bit of the specified long value that is
502      * 1 and returns the bit mask value for that bit. This is also referred to
503      * as the Most Significant 1 Bit. Returns zero if the specified long is
504      * zero.
505      *
506      * @param v
507      *            the long to examine.
508      * @return the bit mask indicating the highest 1 bit in {@code v}.
509      * @since 1.5
510      */
highestOneBit(long v)511     public static long highestOneBit(long v) {
512         // Hacker's Delight, Figure 3-1
513         v |= (v >> 1);
514         v |= (v >> 2);
515         v |= (v >> 4);
516         v |= (v >> 8);
517         v |= (v >> 16);
518         v |= (v >> 32);
519         return v - (v >>> 1);
520     }
521 
522     /**
523      * Determines the lowest (rightmost) bit of the specified long value that is
524      * 1 and returns the bit mask value for that bit. This is also referred to
525      * as the Least Significant 1 Bit. Returns zero if the specified long is
526      * zero.
527      *
528      * @param v
529      *            the long to examine.
530      * @return the bit mask indicating the lowest 1 bit in {@code v}.
531      * @since 1.5
532      */
lowestOneBit(long v)533     public static long lowestOneBit(long v) {
534         return v & -v;
535     }
536 
537     /**
538      * Determines the number of leading zeros in the specified long value prior
539      * to the {@link #highestOneBit(long) highest one bit}.
540      *
541      * @param v
542      *            the long to examine.
543      * @return the number of leading zeros in {@code v}.
544      * @since 1.5
545      */
numberOfLeadingZeros(long v)546     public static int numberOfLeadingZeros(long v) {
547         // After Hacker's Delight, Figure 5-6
548         if (v < 0) {
549             return 0;
550         }
551         if (v == 0) {
552             return 64;
553         }
554         // On a 64-bit VM, the two previous tests should probably be replaced by
555         // if (v <= 0) return ((int) (~v >> 57)) & 64;
556 
557         int n = 1;
558         int i = (int) (v >>> 32);
559         if (i == 0) {
560             n +=  32;
561             i = (int) v;
562         }
563         if (i >>> 16 == 0) {
564             n +=  16;
565             i <<= 16;
566         }
567         if (i >>> 24 == 0) {
568             n +=  8;
569             i <<= 8;
570         }
571         if (i >>> 28 == 0) {
572             n +=  4;
573             i <<= 4;
574         }
575         if (i >>> 30 == 0) {
576             n +=  2;
577             i <<= 2;
578         }
579         return n - (i >>> 31);
580     }
581 
582     /**
583      * Determines the number of trailing zeros in the specified long value after
584      * the {@link #lowestOneBit(long) lowest one bit}.
585      *
586      * @param v
587      *            the long to examine.
588      * @return the number of trailing zeros in {@code v}.
589      * @since 1.5
590      */
numberOfTrailingZeros(long v)591     public static int numberOfTrailingZeros(long v) {
592         int low = (int) v;
593         return low !=0 ? Integer.numberOfTrailingZeros(low)
594                        : 32 + Integer.numberOfTrailingZeros((int) (v >>> 32));
595     }
596 
597     /**
598      * Counts the number of 1 bits in the specified long value; this is also
599      * referred to as population count.
600      *
601      * @param v
602      *            the long to examine.
603      * @return the number of 1 bits in {@code v}.
604      * @since 1.5
605      */
bitCount(long v)606     public static int bitCount(long v) {
607         // Combines techniques from several sources
608         v -=  (v >>> 1) & 0x5555555555555555L;
609         v = (v & 0x3333333333333333L) + ((v >>> 2) & 0x3333333333333333L);
610         int i =  ((int)(v >>> 32)) + (int) v;
611         i = (i & 0x0F0F0F0F) + ((i >>> 4) & 0x0F0F0F0F);
612         i += i >>> 8;
613         i += i >>> 16;
614         return i  & 0x0000007F;
615     }
616 
617     /*
618      * On a modern 64-bit processor with a fast hardware multiply, this is
619      * much faster (assuming you're running a 64-bit VM):
620      *
621      * // http://chessprogramming.wikispaces.com/Population+Count
622      * int bitCount (long x) {
623      *     x -=  (x >>> 1) & 0x5555555555555555L;
624      *     x = (x & 0x3333333333333333L) + ((x >>> 2) & 0x3333333333333333L);
625      *     x = (x + (x >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
626      *     x = (x * 0x0101010101010101L) >>> 56;
627      *     return (int) x;
628      * }
629      *
630      * Really modern processors (e.g., Nehalem, K-10) have hardware popcount
631      * instructions.
632      */
633 
634     /**
635      * Rotates the bits of the specified long value to the left by the specified
636      * number of bits.
637      *
638      * @param v
639      *            the long value to rotate left.
640      * @param distance
641      *            the number of bits to rotate.
642      * @return the rotated value.
643      * @since 1.5
644      */
rotateLeft(long v, int distance)645     public static long rotateLeft(long v, int distance) {
646         // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
647         return (v << distance) | (v >>> -distance);
648     }
649 
650     /**
651      * Rotates the bits of the specified long value to the right by the
652      * specified number of bits.
653      *
654      * @param v
655      *            the long value to rotate right.
656      * @param distance
657      *            the number of bits to rotate.
658      * @return the rotated value.
659      * @since 1.5
660      */
rotateRight(long v, int distance)661     public static long rotateRight(long v, int distance) {
662         // Shift distances are mod 64 (JLS3 15.19), so we needn't mask -distance
663         return (v >>> distance) | (v << -distance);
664     }
665 
666     /**
667      * Reverses the order of the bytes of the specified long value.
668      *
669      * @param v
670      *            the long value for which to reverse the byte order.
671      * @return the reversed value.
672      * @since 1.5
673      */
reverseBytes(long v)674     public static long reverseBytes(long v) {
675         // Hacker's Delight 7-1, with minor tweak from Veldmeijer
676         // http://graphics.stanford.edu/~seander/bithacks.html
677         v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
678         v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
679         return ((v >>>32)                   ) | ((v                      ) <<32);
680     }
681 
682     /**
683      * Reverses the order of the bits of the specified long value.
684      *
685      * @param v
686      *            the long value for which to reverse the bit order.
687      * @return the reversed value.
688      * @since 1.5
689      */
reverse(long v)690     public static long reverse(long v) {
691         // Hacker's Delight 7-1, with minor tweak from Veldmeijer
692         // http://graphics.stanford.edu/~seander/bithacks.html
693         v = ((v >>> 1) & 0x5555555555555555L) | ((v & 0x5555555555555555L) << 1);
694         v = ((v >>> 2) & 0x3333333333333333L) | ((v & 0x3333333333333333L) << 2);
695         v = ((v >>> 4) & 0x0F0F0F0F0F0F0F0FL) | ((v & 0x0F0F0F0F0F0F0F0FL) << 4);
696         v = ((v >>> 8) & 0x00FF00FF00FF00FFL) | ((v & 0x00FF00FF00FF00FFL) << 8);
697         v = ((v >>>16) & 0x0000FFFF0000FFFFL) | ((v & 0x0000FFFF0000FFFFL) <<16);
698         return ((v >>>32)                   ) | ((v                      ) <<32);
699     }
700 
701     /**
702      * Returns the value of the {@code signum} function for the specified long
703      * value.
704      *
705      * @param v
706      *            the long value to check.
707      * @return -1 if {@code v} is negative, 1 if {@code v} is positive, 0 if
708      *         {@code v} is zero.
709      * @since 1.5
710      */
signum(long v)711     public static int signum(long v) {
712         return v < 0 ? -1 : (v == 0 ? 0 : 1);
713     }
714 
715     /**
716      * Returns a {@code Long} instance for the specified long value.
717      * <p>
718      * If it is not necessary to get a new {@code Long} instance, it is
719      * recommended to use this method instead of the constructor, since it
720      * maintains a cache of instances which may result in better performance.
721      *
722      * @param v
723      *            the long value to store in the instance.
724      * @return a {@code Long} instance containing {@code v}.
725      * @since 1.5
726      */
valueOf(long v)727     public static Long valueOf(long v) {
728         return  v >= 128 || v < -128 ? new Long(v) : SMALL_VALUES[((int) v) + 128];
729     }
730 
731     /**
732      * A cache of instances used by {@link Long#valueOf(long)} and auto-boxing.
733      */
734     private static final Long[] SMALL_VALUES = new Long[256];
735 
736     static {
737         for (int i = -128; i < 128; i++) {
738             SMALL_VALUES[i + 128] = new Long(i);
739         }
740     }
741 }
742