Java에서 정수를 16 진 문자열 표현으로 변환

Sep 17 2020

ints를 16 진수 Strings 로 변환하기위한 자체 Java 메서드를 롤링했습니다 .

import java.util.Arrays;
import java.util.Random;

public class Main {
    
    /**
     * Converts the input integer into its textual hexadecimal representation.
     * 
     * @param a the integer to convert.
     * @return the string representing {@code a} in hexadecimal notation.
     */
    public static String intToHexString(int a) {
        StringBuilder stringBuilder = new StringBuilder(Integer.BYTES * 2);
        boolean inLeadingZeros = true;
        
        while (a != 0) {
            char digit = toHexChar(a & 0xf);
            a >>>= 4;
            
            if (inLeadingZeros) {
                if (digit != 0) {
                    inLeadingZeros = false;
                    stringBuilder.append(digit);
                }
            } else {
                stringBuilder.append(digit);
            }
        }
        
        if (inLeadingZeros) {
            return "0";
        }
        
        return stringBuilder.reverse().toString();
    }
    
    // Converts the integer digit to its textual hexadecimal representation:
    private static char toHexChar(int digit) {
        return digit >= 0 && digit < 10 ? 
                (char)(digit + '0') :
                (char)(digit - 10 + 'a');
    }
    
    private static final int ITERATIONS = 10_000_000;
    private static final int WARMUP_ITERATIONS = 10_000_000;
    
    private static void warmup() {
        System.out.println("Warming up...");
        Random random = new Random();
        
        for (int i = 0; i < WARMUP_ITERATIONS; i++) {
            int a = random.nextInt();
            intToHexString(a);
            Integer.toHexString(a);
        }
        
        System.out.println("Warming up done.");
    }
    
    private static void benchmark() {
        long seed = System.nanoTime();
        Random random = new Random(seed);
        System.out.println("Seed = " + seed);
        
        int[] inputArray = new int[ITERATIONS];
        String[] outputArray1 = new String[inputArray.length];
        String[] outputArray2 = new String[inputArray.length];
        
        for (int i = 0; i < inputArray.length; i++) {
            inputArray[i] = random.nextInt();
        }
        
        // Benchmarking intToHexString:
        long startTime = System.nanoTime();
        
        for (int i = 0; i < ITERATIONS; i++) {
            outputArray1[i] = intToHexString(inputArray[i]);
        }
        
        long endTime = System.nanoTime();
        
        System.out.println(
                "intToHexString in " + 
                        ((endTime - startTime) / 1000_000) +
                        " milliseconds.");
        
        // Benchmarking Integer.toHexString:
        startTime = System.nanoTime();
        
        for (int i = 0; i < ITERATIONS; i++) {
            outputArray2[i] = Integer.toHexString(inputArray[i]);
        }
        
        endTime = System.nanoTime();
        
        System.out.println(
                "Integer.toHexString in " + 
                        ((endTime - startTime) / 1000_000) + 
                        " milliseconds.");
        
        System.out.println("Methods agree: " + Arrays.equals(outputArray1,
                                                             outputArray2));
    }
    
    public static void main(String[] args) {
        warmup();
        benchmark();
    }
}

샘플 출력 Warming up... Warming up done. Seed = 1290249323142300 intToHexString in 1041 milliseconds. Integer.toHexString in 562 milliseconds. Methods agree: true

비평 요청

떠오르는 것이 있으면 알려주세요.

답변

4 JoopEggen Sep 17 2020 at 18:42
  • inLeadingZeros 의심 스럽습니다. 아마 잘못된 이름
  • 0x00_00_03_44는 "344"로 출력되는 반면, 기존은 두 배의 "0344"(또는 "03 44"로 간격이 지정됨)입니다. 왼쪽에서 오른쪽으로 두 문자 씩 바이트를 만들 수있는 이유입니다.
  • 예외적 인 경우는 아마도 미리 처리 할 수 ​​있습니다.
  • 오류 또는 다른 의미가 if (digit != 0) {있어야합니다 if (digit != '0') {.
  • toHexChar는 여전히 정수 0..10을 예상합니다. 그래서 아마도 의미 론적 충돌 일 것입니다.
  • a매개 변수 이름은 특히 영어에서 불행합니다. num또는 n더 명확합니다.

변수 & if 때문에 코드를 읽는 것만으로 코드가 올바른지 확실하지 않습니다.

/**
 * Converts the given integer into its textual hexadecimal representation.
 * 
 * @param num the integer to convert.
 * @return the string representing {@code num} in hexadecimal notation.
 */
public static String intToHexString(int num ) {
    if (num == 0) {
        return "00";
    }
    
    StringBuilder stringBuilder = new StringBuilder(Integer.BYTES * 2);
    while (num != 0) {
        char digit = toHexChar(num & 0xf);
        num >>>= 4;
        stringBuilder.append(digit);

        digit = toHexChar(num & 0xf);
        num >>>= 4;
        stringBuilder.append(digit);
    }
    return stringBuilder.reverse().toString();
}

// Converts the integer digit to its textual hexadecimal representation:
private static char toHexChar(int digit) {
    return 0 <= digit && digit < 10 ? 
            (char)(digit + '0') :
            (char)(digit - 10 + 'a');
}