2010-05-17 3 views
0

Мне нужно преобразовать целочисленное значение в шестнадцатеричное.Оптимальный код в Java для преобразования целочисленного значения в шестнадцатеричный

Я сделал с некоторыми логическими, но я хочу оптимизированные решения.

EDIT: Извините, что забыл опубликовать, что мне не разрешено использовать какие-либо встроенные функции.

+1

Почему вы хотите оптимизированное решение? – monn

+1

Почему вам не разрешено использовать какие-либо встроенные функции? – Esko

+1

Вы не можете преобразовать int в любую базу, он всегда будет храниться в двоичном формате. Однако вы можете отображать int в других базах. – Oak

ответ

4

Предполагая, что вы не хотите использовать встроенный в toHexString по какой-то причине, вот один довольно эффективный способ сделать это:

public static char toHexChar(int i) { 
    i&=15; 
    return (i<10)? (char)(i+48) : (char)(i+55); 
} 

public static String toHexString(int n) { 
    char[] chars=new char[8]; 
    for (int i=0; i<8; i++) { 
    chars[7-i]=toHexChar(n); 
    n>>=4; 
    }; 
    return new String(chars); 
} 
+1

Это печатает ведущие нули, не так ли? Как '00000005' для ввода' 5'? – aioobe

+0

Обратите внимание, что эта реализация всегда возвращает ответ в восьми шестнадцатеричных цифрах ... это, вероятно, то, что вы хотите в большинстве случаев, но если вы хотите точно соответствовать встроенной функции Java, вам нужно будет удалить ведущие нули. – mikera

+0

@aioobe, который является правильным. Вопрос о вкусе, который я думаю, но мне всегда нравится держать ведущие нули, чтобы напомнить мне, что я имею дело с 32-битной двоичной величиной – mikera

5

Easy:

String hex = Integer.toHexString(int); 

В принципе, что это делает создает новую строку, а затем вызов метода из класса Integer называется toHexString, который нуждается в ИНТ ARG. Итак, передайте int, который вы хотите изменить в этот метод, и вы получите String с шестнадцатеричной версией вашего int back.

Вы можете поместить шестнадцатеричные значения в типы int, но вы не можете преобразовать из типа int в другой тип int, насколько я знаю, когда вы выполняете шестнадцатеричные преобразования.

Помните, что возвращаемое вами значение является строкой, поэтому вы не можете изменить значение, иначе вы получите исключение в числовом формате.

4

Хорошо, то посмотрите на реализацию Integer.toHexString(int). Следующий код извлекается из класса Integer в стандартной библиотеке java.

public class Test { 

    final static char[] digits = { 
     '0' , '1' , '2' , '3' , '4' , '5' , 
     '6' , '7' , '8' , '9' , 'a' , 'b' , 
     'c' , 'd' , 'e' , 'f' 
    }; 

    private static String intAsHex(int i) { 
     char[] buf = new char[32]; 
     int charPos = 32; 
     int radix = 1 << 4; 
     int mask = radix - 1; 
     do { 
      buf[--charPos] = digits[i & mask]; 
      i >>>= 4; 
     } while (i != 0); 

     return new String(buf, charPos, (32 - charPos)); 
    } 


    public static void main(String... args) { 
     System.out.println(intAsHex(77)); 
    } 
} 

Выход:4d

+0

Если это стандартная реализация библиотеки, то я удивлен, что они выделяют массив в четыре раза больше, чем когда-либо понадобится! – mikera

1

Проверьте это

public class IntToHexa { 
    public static void main(java.lang.String args[]){ 
     /* 
     * Here we need an integer to convert. 
     * [1]You can pass as command line argument 
     * [2]You can get as input from console 
     * [3]Take a constant. Here I'm taking a constant 
     */ 
     int intToConvert = 450; 
     java.lang.StringBuilder convertedHexa = new java.lang.StringBuilder(""); 
     while (intToConvert > 15){ 
      /* 
     * If the reminder is less than 10, add the remainder. else get the equivalent hexa code 
     * Here I'm getting the character code and adding the charater to the hexa string. 
     * For that I'm getting the difference between the reminder and 10. 
     * For example, if the reminder is 13, the reminder will be 3. 
     * Then add that difference to 65. In this example, it will become 68. 
     * Finally, get the quivalent char code of the result number. Here it will be D. 
     * Same for number, I'm adding it to 48 
     */ 
      convertedHexa.append(intToConvert % 16 < 10 ? ((char)(48 + (intToConvert % 16))) : ((char)(65 + (intToConvert % 16 - 10)))); 
      intToConvert /= 16; 
     } 
     convertedHexa.append(intToConvert % 16 < 10 ? ((char)(48 + (intToConvert % 16))) : ((char)(65 + (intToConvert % 16 - 10)))); 
     java.lang.System.out.println(convertedHexa.reverse()); 
    } 
} 
+1

Это не удается различными способами: например. производит странные значения для 10-15. Я подозреваю, что «intToConvert% 16» также будет делать некоторые странные вещи с отрицательными числами. – mikera

+0

@mikera Исправлена ​​первая точка. Спасибо за комментарий. –

Смежные вопросы