【题目】405. 数字转换为十六进制数
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例 1:
输入:
26
输出:
"1a"
示例 2:
输入:
-1
输出:
"ffffffff"
【解题思路1】位运算
位运算思路:
每四位二进制等于一位十六进制,第一思想肯定是先把数字转成二进制数组,之后再进行每四位转译为一位十六进制,但是这样会存在负数,符号位的问题,而且-2147483648这个用例存在转正溢出啊,只要使用取巧的方式,每次与0xf相与,取出最低四位,之后数字无符号左移四位,循环拼接字符串。
经过这道题目,可以看出想要拿到数字的二进制低位,只需要与要转换的进制最后一个数字相与,之后循环即可。
例如每次拿十进制的最后一个二进制
while(num != 0) {
int low = num & 1;
num = num >>> 1;
}
拿十进制的最低四位
while(num!=0) {
int low = num & 0xf;
num = num >>> 4;
}
class Solution {
private final static String[] hex = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
public String toHex(int num) {
if (num >= 0 && num < 16) return hex[num];
int tmp = 0xf; //进制
StringBuilder sb = new StringBuilder();
while (num != 0) {
int low = num & tmp;
num = num >>> 4;
sb.insert(0, hex[low]);
}
return sb.toString();
}
}
//另一种写法
class Solution {
public String toHex(int num) {
char[] hex = "0123456789abcdef".toCharArray();
String s = new String();
while(num != 0){
int end = num&15;
s = hex[end] + s;
num >>>=4; //无符号右移
}
if(s.length() == 0){
s = "0";
}
return s;
}
}