java.lang의java.lang.Long 소스 읽기 및 분석
5057 단어 java 기초
Long에는 구성원 변수인 private final longvalue가 있습니다.
32비트 시스템의 다음 Long 객체는 16바이트, 객체 헤드는 8바이트, 구성원 변수는 8바이트로 채우지 않아도 됩니다.
64비트 시스템에서 포인터 압축이 켜져 있든 없든 24바이트를 차지합니다.구체적인 분석 절차는 Integer 소스 분석을 참조하십시오.
2, toString 방법
public static String toString(long i) {
if (i == Long.MIN_VALUE)
return "-9223372036854775808";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
주요 실현은 getChars 방법에서static void getChars(long i, int index, char[] buf) {
long q;
int r;
int charPos = index;
char sign = 0;
if (i < 0) {
sign = '-';
i = -i;
}
// Get 2 digits/iteration using longs until quotient fits into an int
while (i > Integer.MAX_VALUE) {
q = i / 100;
// really: r = i - (q * 100);
r = (int)(i - ((q << 6) + (q << 5) + (q << 2)));
i = q;
buf[--charPos] = Integer.DigitOnes[r];
buf[--charPos] = Integer.DigitTens[r];
}
// Get 2 digits/iteration using ints
int q2;
int i2 = (int)i;
while (i2 >= 65536) {
q2 = i2 / 100;
// really: r = i2 - (q * 100);
r = i2 - ((q2 << 6) + (q2 << 5) + (q2 << 2));
i2 = q2;
buf[--charPos] = Integer.DigitOnes[r];
buf[--charPos] = Integer.DigitTens[r];
}
// Fall thru to fast mode for smaller numbers
// assert(i2 <= 65536, i2);
for (;;) {
q2 = (i2 * 52429) >>> (16+3);
r = i2 - ((q2 << 3) + (q2 << 1)); // r = i2-(q2*10) ...
buf[--charPos] = Integer.digits[r];
i2 = q2;
if (i2 == 0) break;
}
if (sign != 0) {
buf[--charPos] = sign;
}
}
Integer의 tostring 방법과 유사하지만 다른 것은 Integer의 tostring 방법은 두 부분으로 나누어 처리했다. 65536보다 크고 65536보다 작은 부분, Long의 tostring 방법은 세 부분으로 나누어 처리했고 일부는 Integer보다 크다.MAX_VALUE 섹션, 나머지는 Integer를 사용합니다.toString 메서드 처리
3, value Of 메서드
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
Integer의valueOf 방법과 유사하며 -128에서 127의 데이터도 캐시했다.
4, HighestOneBit 방법
public static long highestOneBit(long i) {
// HD, Figure 3-1
i |= (i >> 1);
i |= (i >> 2);
i |= (i >> 4);
i |= (i >> 8);
i |= (i >> 16);
i |= (i >> 32);
return i - (i >>> 1);
}
와 Integer."HighestOneBit 방법은 유사하며, 숫자 i의 바이너리 맨 왼쪽은""1""으로 표시됩니다."
5,
lowestOneBit 방법
public static long lowestOneBit(long i) {
// HD, Section 2-1
return i & -i;
}
숫자 i 바이너리의 맨 오른쪽이 "1"인 값6,
numberOfleadingZeros 메서드
public static int numberOfLeadingZeros(long i) {
// HD, Figure 5-6
if (i == 0)
return 64;
int n = 1;
int x = (int)(i >>> 32);
if (x == 0) { n += 32; x = (int)i; }
if (x >>> 16 == 0) { n += 16; x <<= 16; }
if (x >>> 24 == 0) { n += 8; x <<= 8; }
if (x >>> 28 == 0) { n += 4; x <<= 4; }
if (x >>> 30 == 0) { n += 2; x <<= 2; }
n -= x >>> 31;
return n;
}
숫자 i 바이너리의 맨 왼쪽이 "1"이 되기 전에 "0"이 몇 개 있었는지 계산합니다.7, numberOftrailingZeros 메서드
public static int numberOfTrailingZeros(long i) {
// HD, Figure 5-14
int x, y;
if (i == 0) return 64;
int n = 63;
y = (int)i; if (y != 0) { n = n -32; x = y; } else x = (int)(i>>>32);
y = x <<16; if (y != 0) { n = n -16; x = y; }
y = x << 8; if (y != 0) { n = n - 8; x = y; }
y = x << 4; if (y != 0) { n = n - 4; x = y; }
y = x << 2; if (y != 0) { n = n - 2; x = y; }
return n - ((x << 1) >>> 31);
}
숫자 i 바이너리의 맨 오른쪽이 "1"이고 그 다음에 "0"이 몇 개 있습니까?
8, bitCount 메서드
public static int bitCount(long i) {
// HD, Figure 5-14
i = i - ((i >>> 1) & 0x5555555555555555L);
i = (i & 0x3333333333333333L) + ((i >>> 2) & 0x3333333333333333L);
i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f0f0fL;
i = i + (i >>> 8);
i = i + (i >>> 16);
i = i + (i >>> 32);
return (int)i & 0x7f;
}
숫자 i 이진법 표시 중 몇 개가 있는지 계산하기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Java 네트워크 프로그래밍의 UDP 서버 및 클라이언트 프로그램서버: 클라이언트: UDP: 클라이언트를 열어 데이터를 받을 때까지 기다린 다음 서버를 열어 데이터를 보냅니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.