碎碎念
前天熬的夜今天也是全还回来了好晕啊。。图书馆这两天空调开得也很大,平常都不带外套的今天都裹上了。
题目

十进制转n进制通用模板
javascript
/**
* @param {number} num
* @param {number} base
* @return {string}
*/
var convertToBaseN = function(num, base) {
if (num === 0) return '0'
const digits = '0123456789ABCDEF'
let res = ''
while (num > 0) {
res = digits[num % base] + res
num = Math.floor(num / base)
}
return res
};
本题思路
正数部分没什么好说的套模板就行了。
负数说要用补码,这就需要了解一下补码是怎么计算的了。手算的话可以看看下面两个方法:
- 符号位保持不变,将尾数按位取反后加1。

- 符号位保持不变,尾数自低位向高位,第一个1及其以前的各位0保持不变,其他位按位取反。

上面也算小复习了哈哈哈,但如果是在代码里呢?可以看下补码和真值的映射:

可以看到负数的真值加上2^{n}就可以。而这题数的范围是-2^{-31}~2^{31}-1,因此我们加上2^{32}之后按照正数的继续算就行。
代码
javascript
/**
* @param {number} num
* @return {string}
*/
var toHex = function(num) {
if (num === 0) return '0'
const digit = '0123456789abcdef'
let ans = ''
if (num < 0) num += Math.pow(2, 32)
while (num > 0) {
ans = digit[num % 16] + ans
num = Math.floor(num / 16)
}
return ans
};