java.lang의java.lang.Long 소스 읽기 및 분석

5057 단어 java 기초
1, 메모리에서 Long 객체 크기
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 이진법 표시 중 몇 개가 있는지 계산하기

좋은 웹페이지 즐겨찾기