数字转换为十六进制数


数字转换为十六进制数

题目

1
2
3
4
5
6
7
8
9
10
11
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法
答案字符串中的所有字母都应该是小写字符,并且除了 0 本身之外,答案中不应该有任何前置零
注意: 不允许使用任何由库提供的将数字直接转换或格式化为十六进制的方法来解决这个问题

示例 1:
输入:num = 26
输出:"1a"

示例 2:
输入:num = -1
输出:"ffffffff"

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
思路:
循环/16,余数放到末尾,输入0返回0,输入负数先算补码,用补码计算

代码:
/**
* @param Integer $num
*
* @return String
*/
function toHex($num)
{
if ($num < 0) {
// 对于小于0的数,使用补码,位运算取反+1
$num = -$num ^ 0xffffffff;
$num++;
}

if ($num === 0) {
return '0';
}

$str = '';
while ($num) {
$mod = $num % 16;

if ($mod > 9) {
// 大于9的数,+87对应到ASCII的字符
$str = chr($num % 16 + 87) . $str;
} else {
$str = $num % 16 . $str;
}
$num = intdiv($num, 16);
}

return $str;
}