您的位置:首页 > 其它

leetcode[Convert a Number to Hexadecimal]//待整理多种解法

2017-07-18 22:00 507 查看
解法一:

public class Solution {
/*一个知识点:
在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为 “1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
*/
public String toHex(int num) {
//创建hex数组用于转换正数的16进制,hex是char类型的数组,而不是int型的
char[] hex = new char[16];
for(int i = 0; i < 10; i++){
hex[i] = (char) (i + '0');
}
for(int i = 10; i < 16; i++){
hex[i] = (char) ('a' + i - 10);
}

//创建map用于转换负数的16进制
HashMap<String, Character> map = new HashMap<>();
map.put("0000", '0');map.put("0001", '1');map.put("0010", '2');map.put("0011", '3');
map.put("0100", '4');map.put("0101", '5');map.put("0110", '6');map.put("0111", '7');
map.put("1000", '8');map.put("1001", '9');map.put("1010", 'a');map.put("1011", 'b');
map.put("1100", 'c');map.put("1101", 'd');map.put("1110", 'e');map.put("1111", 'f');

if(num == 0){
return "0";
}
else if(num > 0){
StringBuilder sb = new StringBuilder();
while(num != 0){
sb.append(hex[num % 16]);
num /= 16;
}

return sb.reverse().toString();
}
else{
String s = Integer.toBinaryString(num);//负数转换完后一定有32位二进制数
StringBuilder sb = new StringBuilder();
for(int i = 0; i < s.length(); i += 4){
//关于substring
/* "hamburger".substring(4, 8) returns "urge"
"smiles".substring(1, 5) returns "mile"*/
String sub = s.substring(i, i + 4);
sb.append(map.get(sub));
}

return sb.toString();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: