给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
- 十六进制中所有字母(
a-f
)都必须是小写。 - 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符
'0'
来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 - 给定的数确保在32位有符号整数范围内。
- 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入: 26 输出: "1a"
示例 2:
输入: -1 输出: "ffffffff"
第一种暴力解决方法:
public String toHex(int num) { if(num==0) return "0"; Stack<Character> stack=new Stack<>(); String s=""; if(num>0) { while(num!=0) { int x=num%16; if(x>=10) { char ch=(char)(x+87); stack.push(ch); }else stack.push((char)(x+48)); num=num/16; } while(!stack.isEmpty()) { s+=stack.pop(); } }else { num=-num; //转换成二进制 while(num!=0) { int x=num%2; stack.push((char)(x+48)); num=num/2; } //凑成32位 while(stack.size()<32) { stack.push('0'); } //取反 while(!stack.isEmpty()) { char ch=stack.pop(); if(ch=='0') s+=1; else s+=0; } //System.out.println(s); //加一 char a[]=s.toCharArray(); int cy=1; for(int i=a.length-1;i>=0;i--) { if(a[i]=='1'&&cy==1) { cy=1; a[i]='0'; }else if(a[i]=='0'&&cy==1) { a[i]='1'; cy=0; }else cy=0; } //把二进制转化成16进制 String str=""; boolean flag=true; for(int i=0;i<s.length();i=i+4) { int x=(int)(a[i]-'0'); int y=(int)(a[i+1]-'0'); int z=(int)(a[i+2]-'0'); int m=(int)(a[i+3]-'0'); int sum=(x*8+y*4+z*2+m*1); //去除前面的0 if(sum==0&&flag) { i=i+4; continue; }else flag=false; if(sum>=10) { str+=((char)(sum+87)); }else str+=sum; } s=str; } return s; }
第二种,参考别人的。。。使用位运算:
public static String toHex(int num) { if(num==0) return "0"; Stack<Character> stack=new Stack<>(); char hex[]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; int count=0;//用来记录是否已经到第32位 while(num!=0&&count<8) { int i=num&0xf;//num低四位与16进制的f进行与运算,得到num的低四位16进制对应的整数 stack.push(hex[i]);//查表,并入栈 num=num>>4;//右移四位 count++; } String s=""; while(!stack.isEmpty()) { s+=stack.pop(); } return s; }