405. 数字转换为十六进制数
StringBuilder
要求返回字符串,使用StringBuilder。StringBuilder是线程不安全的,但是相对于StringBuffer速度较快,虽然StringBuffer是线程安全的。
StringBuffer 和SrtringBuilder用法相似。
使用StringBuilder 会比String节省空间。
负数二进制运算
按照进制转换,负数的情况需要按位取反,末位+1,但是这需要转换成 2进制,避免多一次进制转换,直接使用 2 的 32 次幂+num,与进制转换是相同的效果,但是 2 的 32次幂已经超出了 int 范围,所以需要 long。
加上2^32的偏移量与 按位取反,末位+1 的效果相同。
1/2,那么直接右移一位。0x1 >> 1 == 0
-1/2,右移是不行的,0xF >> 1 == -1`右移之后还是 -1,不会改变原本的值。
class Solution {
/**
因为直接计算16进制的最高位难度较大,所以采用了字符串翻转的方法,先计算末位,最后再翻转
*/
public String toHex(int num) {
if(num == 0)return "0";
//使用long是为了 num为负数的时候加上2^32的偏移量
long long_num = num;
StringBuilder sb = new StringBuilder();
//对于负数的num ,要 加上2^32的偏移量,再进行转换。
if(num < 0){
//负数的情况需要按位取反,末位+1
//加上2^32的偏移量与 按位取反,末位+1 的效果相同
long_num = (long)(Math.pow(2,32)+long_num);
}
while(long_num!=0){
//用u来记录末位
long u = long_num%16;
//用ASC码转为字符
char c = (char)(u +'0');
if(u >= 10){
//再利用ASC码将10-16 转为a - f
c = (char)(u -10+'a');
}
sb.append(c);
long_num/= 16;
}
return sb.reverse().toString();
}
}