https://leetcode.com/problems/convert-a-number-to-hexadecimal/
嗯,就因为开头那一句负数参考补码,我研究了半天的补码。然后我发现...其实根本就不是那么回事。
如果这一题不允许负数的话,最直观的想法就是不停的模16然后除以16即可。然后看了看补码,想该怎么变换数字才能够继续这种无脑模16除16,发现这样做真的很复杂。所以换一种思维好了,16进制的表达法,其实就是2进制的表达法中,每四个1或0组成一组,然后将这一组二进制的四位数变成一个十六进制的一位数就好了,把它彻底变成一个位运算的题目,每次取其中最后四位变成一个十六进制数,然后整个数字右移四位,不停循环到数字为0即可。根据这个想法,就很快可以得到代码如下:
public String toHex(int num) {
if (num == 0) return "0";
int mask = 15;
StringBuilder resBuilder = new StringBuilder();
for (int i = 0; i < 8 && num != 0; i++) {
int value = mask & num;
char ch;
if (value < 10) {
ch = (char)('0' + value);
} else {
ch = (char)('a' + (value - 10));
}
resBuilder.append(ch);
num >>= 4;
}
resBuilder.reverse();
return resBuilder.toString();
}
其中mask = 15,其实也就是1111,所以每次mask & num其实就是取这个数字的最后四位。0是一个特别情况,你不能返回空字符串,所以就拿来特别处理就好。你也可以把mask换成0xf0000000,然后不停左移四位,这样就可以免掉reverse的那一步。