Java中将整数值转换为十六进制的最佳代码

Java中将整数值转换为十六进制的最佳代码,java,converter,Java,Converter,我需要将整数值转换成十六进制 我已经做了一些逻辑,但我想要优化的解决方案 编辑:对不起,我忘了发布我不允许使用任何内置函数的消息。简单: String hex = Integer.toHexString(int); 基本上,这是创建一个新字符串,然后从Integer类调用一个方法,名为toHexString,它需要一个int参数。 因此,将您想要更改的int传递到这个方法中,您将得到一个包含十六进制int版本的字符串 可以将十六进制值放在int类型中,但据我所知,在进行十六进制转换时,不能从i

我需要将整数值转换成十六进制

我已经做了一些逻辑,但我想要优化的解决方案

编辑:对不起,我忘了发布我不允许使用任何内置函数的消息。

简单:

String hex = Integer.toHexString(int);
基本上,这是创建一个新字符串,然后从Integer类调用一个方法,名为toHexString,它需要一个int参数。 因此,将您想要更改的int传递到这个方法中,您将得到一个包含十六进制int版本的字符串

可以将十六进制值放在int类型中,但据我所知,在进行十六进制转换时,不能从int类型转换为另一个int类型


请记住,返回的值是一个字符串,因此不能修改该值,否则将出现数字格式异常。

那么请看一下Integer.tohextString(int)的实现。。以下代码是从java标准库中的
Integer
类中提取的

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));
    }
}
公共类测试{
最终静态字符[]位={
'0' , '1' , '2' , '3' , '4' , '5' ,
‘6’、‘7’、‘8’、‘9’、‘a’、‘b’,
“c”、“d”、“e”、“f”
};
私有静态字符串intAsHex(int i){
char[]buf=新字符[32];
int charPos=32;
整数基数=1>>=4;
}而(i!=0);
返回新字符串(buf,charPos,(32-charPos));
}
公共静态void main(字符串…参数){
系统输出println(intAsHex(77));
}
}

输出:
4d

假设出于某种原因您不想使用内置的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);
 }
publicstaticchartohexchar(inti){
i&=15;
回报率(i=4;
};
返回新字符串(字符);
}
检查此项

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());
    }
}
公共类IntToHexa{
公共静态void main(java.lang.String参数[]){
/*
*这里我们需要一个整数来转换。
*[1]可以作为命令行参数传递
*[2]您可以从控制台获取输入
*[3]取一个常数,这里我取一个常数
*/
int intToConvert=450;
java.lang.StringBuilder convertedHexa=新java.lang.StringBuilder(“”);
而(intToConvert>15){
/*
*如果提醒小于10,则添加剩余部分。否则获取等效的hexa代码
*这里我得到字符代码,并将字符添加到十六进制字符串中。
*因此,我得到了提醒和10之间的区别。
*例如,如果提醒是13,则提醒将是3。
*然后把这个差加上65。在这个例子中,它将变成68。
*最后,得到结果数的等价字符码,这里是D。
*数字是一样的,我把它加到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));
println(convertedHexa.reverse());
}
}

为什么需要优化的解决方案?为什么不允许使用任何内置函数?您不能将int转换为任何基,它将始终以二进制形式存储。但是,您可以在其他基中显示int。@fish这根本不是我的家庭作业……而是我在这样的项目中工作,在这些项目中我不能使用内置函数……正如我所说的那样不讨论y和在哪里…希望你理解…如果你觉得这个问题是家庭作业,那么很抱歉…知道为什么你不能使用内置函数会很有趣,但是如果你不能告诉…不能做很多:)这会打印前导零,对吗?与输入的
00000005
类似,请注意此实现始终以八个十六进制数字返回答案。。。在大多数情况下,这可能是您想要的,但是如果您想要与内置Java函数完全匹配,则需要删除前导零。@aioobe这是正确的。我想是口味的问题,但我总是喜欢保留前导零,以提醒我,我处理的是32位二进制数量。这会以各种方式失败:例如,为10-15生成奇怪的值。我怀疑“intToConvert%16”也会用负数做一些奇怪的事情。如果这是标准的库实现,那么我很惊讶他们会分配一个四倍于所需大小的数组!