www.pudn.com > j2me_cldc-1_1-fcs-src-winunix.rar > Long.java
/* * Copyright © 2003 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. * */ package java.lang; /** * The Long class wraps a value of the primitive typelong* in an object. An object of typeLongcontains a single * field whose type islong. ** In addition, this class provides several methods for converting a *
longto aStringand a *Stringto along, as well as other * constants and methods useful when dealing with a *long. * * @author Lee Boynton * @author Arthur van Hoff * @version 12/17/01 (CLDC 1.1) * @since JDK1.0, CLDC 1.0 */ public final class Long { /** * The smallest value of typelong. */ public static final long MIN_VALUE = 0x8000000000000000L; /** * The largest value of typelong. */ public static final long MAX_VALUE = 0x7fffffffffffffffL; /** * Creates a string representation of the first argument in the * radix specified by the second argument. ** If the radix is smaller than
Character.MIN_RADIXor * larger thanCharacter.MAX_RADIX, then the radix *10is used instead. ** If the first argument is negative, the first element of the * result is the ASCII minus sign
'-'* ('\u002d'. If the first argument is not negative, * no sign character appears in the result. ** The remaining characters of the result represent the magnitude of * the first argument. If the magnitude is zero, it is represented by * a single zero character
'0'* ('\u0030'); otherwise, the first character of the * representation of the magnitude will not be the zero character. * The following ASCII characters are used as digits: ** These are '\u0030' through '\u0039' * and '\u0061' through '\u007a'. If the * radix is N, then the first N of these * characters are used as radix-N digits in the order * shown. Thus, the digits for hexadecimal (radix 16) are ** 0123456789abcdefghijklmnopqrstuvwxyz ** * @param i a long. * @param radix the radix. * @return a string representation of the argument in the specified radix. * @see java.lang.Character#MAX_RADIX * @see java.lang.Character#MIN_RADIX */ public static String toString(long i, int radix) { if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) radix = 10; char[] buf = new char[65]; int charPos = 64; boolean negative = (i < 0); if (!negative) { i = -i; } while (i <= -radix) { buf[charPos--] = Integer.digits[(int)(-(i % radix))]; i = i / radix; } buf[charPos] = Integer.digits[(int)(-i)]; if (negative) { buf[--charPos] = '-'; } return new String(buf, charPos, (65 - charPos)); } /** * Returns a new String object representing the specified integer. * The argument is converted to signed decimal representation and * returned as a string, exactly as if the argument and the radix * 10 were given as arguments to the * {@link #toString(long, int)} method that takes two arguments. * * @param i a* 0123456789abcdef. *longto be converted. * @return a string representation of the argument in base 10. */ public static String toString(long i) { return toString(i, 10); } /** * Parses the string argument as a signedlongin the * radix specified by the second argument. The characters in the * string must all be digits of the specified radix (as determined by * whetherCharacter.digitreturns a * nonnegative value), except that the first character may be an * ASCII minus sign'-'('\u002d' to indicate * a negative value. The resultinglongvalue is returned. ** Note that neither L nor l is permitted to appear at * the end of the string as a type indicator, as would be permitted in * Java programming language source code - except that either L * or l may appear as a digit for a radix greater than 22. *
* An exception of type NumberFormatException is thrown if any of * the following situations occurs: *
* Examples: *
* parseLong("0", 10) returns 0L
* parseLong("473", 10) returns 473L
* parseLong("-0", 10) returns 0L
* parseLong("-FF", 16) returns -255L
* parseLong("1100110", 2) returns 102L
* parseLong("99", 8) throws a NumberFormatException
* parseLong("Hazelnut", 10) throws a NumberFormatException
* parseLong("Hazelnut", 36) returns 1356099454469L
*
*
* @param s the String containing the
* long.
* @param radix the radix to be used.
* @return the long represented by the string argument in
* the specified radix.
* @exception NumberFormatException if the string does not contain a
* parsable integer.
*/
public static long parseLong(String s, int radix)
throws NumberFormatException
{
if (s == null) {
throw new NumberFormatException("null");
}
if (radix < Character.MIN_RADIX) {
throw new NumberFormatException("radix " + radix +
" less than Character.MIN_RADIX");
}
if (radix > Character.MAX_RADIX) {
throw new NumberFormatException("radix " + radix +
" greater than Character.MAX_RADIX");
}
long result = 0;
boolean negative = false;
int i = 0, max = s.length();
long limit;
long multmin;
int digit;
if (max > 0) {
if (s.charAt(0) == '-') {
negative = true;
limit = Long.MIN_VALUE;
i++;
} else {
limit = -Long.MAX_VALUE;
}
multmin = limit / radix;
if (i < max) {
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw new NumberFormatException(s);
} else {
result = -digit;
}
}
while (i < max) {
// Accumulating negatively avoids surprises near MAX_VALUE
digit = Character.digit(s.charAt(i++),radix);
if (digit < 0) {
throw new NumberFormatException(s);
}
if (result < multmin) {
throw new NumberFormatException(s);
}
result *= radix;
if (result < limit + digit) {
throw new NumberFormatException(s);
}
result -= digit;
}
} else {
throw new NumberFormatException(s);
}
if (negative) {
if (i > 1) {
return result;
} else { /* Only got "-" */
throw new NumberFormatException(s);
}
} else {
return -result;
}
}
/**
* Parses the string argument as a signed decimal long.
* The characters in the string must all be decimal digits, except
* that the first character may be an ASCII minus sign
* '-' (\u002d') to indicate a negative
* value. The resulting long value is returned, exactly as if the
* argument and the radix 10 were given as arguments to the
* {@link #parseLong(String, int)} method that takes two arguments.
*
* Note that neither L nor l is permitted to appear
* at the end of the string as a type indicator, as would be permitted
* in Java programming language source code.
*
* @param s a string.
* @return the long represented by the argument in decimal.
* @exception NumberFormatException if the string does not contain a
* parsable long.
*/
public static long parseLong(String s) throws NumberFormatException {
return parseLong(s, 10);
}
/**
* The value of the Long.
*/
private long value;
/**
* Constructs a newly allocated Long object that
* represents the primitive long argument.
*
* @param value the value to be represented by the
* Long object.
*/
public Long(long value) {
this.value = value;
}
/**
* Returns the value of this Long as a long value.
*
* @return the long value represented by this object.
*/
public long longValue() {
return (long)value;
}
/**
* Returns the value of this Long as a float.
*
* @return the long value represented by this object is
* converted to type float and the result of
* the conversion is returned.
* @since CLDC 1.1
*/
public float floatValue() {
return (float)value;
}
/**
* Returns the value of this Long as a double.
*
* @return the long value represented by this object that
* is converted to type double and the result of
* the conversion is returned.
* @since CLDC 1.1
*/
public double doubleValue() {
return (double)value;
}
/**
* Returns a String object representing this Long's value.
* The long integer value represented by this Long object is converted
* to signed decimal representation and returned as a string, exactly
* as if the long value were given as an argument to the
* {@link #toString(long)} method that takes one argument.
*
* @return a string representation of this object in base 10.
*/
public String toString() {
return String.valueOf(value);
}
/**
* Computes a hashcode for this Long. The result is the exclusive
* OR of the two halves of the primitive long value
* represented by this Long object. That is, the hashcode
* is the value of the expression:
*
* (int)(this.longValue()^(this.longValue()>>>32))
*
*
* @return a hash code value for this object.
*/
public int hashCode() {
return (int)(value ^ (value >> 32));
}
/**
* Compares this object against the specified object.
* The result is true if and only if the argument is
* not null and is a Long object that
* contains the same long value as this object.
*
* @param obj the object to compare with.
* @return true if the objects are the same;
* false otherwise.
*/
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
}