公众号:offer多多
V1
2022/02/26阅读:24主题:橙心
【day7】405. 数字转换为十六进制数

题目
【day7】405. 数字转换为十六进制数
-
给定一个整数,编写一个算法将这个数转换为十六进制数。
-
对于负整数,我们通常使用 补码运算 方法。
-
输入:26输出:"1a"
-
算数位移,其中正数右移左边补0,负数右移左边补1


答案
class Solution
{
public:
//十进制转整数串化为十六制转字符串
string toHex(int num)
{
if (num == 0)
return "0";
string output;
string key = "0123456789abcdef";
unsigned int n = num > 0 ? num : (unsigned int)num;
//循环8次
while (n > 0)
{
int index = n & 0x000f; // 第四位
output.push_back(key[index]);
n = n >> 4;
} //如果负数怎么处理。 这里为什么限制 大于0呢
reverse(output.begin(), output.end());
return output;
}
//十六进制转字符串化为十进制
int toInteger(string input)
{
unsigned int num = 0; //假设32系统
//parseUnsignedInt
//Parses the string argument as an unsigned integer in the radix
for (char item : input)
{
int bit = item >= 'a' ? item - 'a' + 10 : item - '0'; //将字符对应的ASCII值转为数值
num = num * 16 + bit; //why 不考虑溢出问题 num变成负数。
}
return (int)num;
}
};
JAVA
package leetcode;
public class Lc405 {
public String toHex(int num) {
// 01 check
if (num == 0)
return "0";
// 02 data
StringBuilder output = new StringBuilder();
int lowBit = 0x000f;// 15
char[] mapHex = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
int n = num;
// 03 time
//while (n > 0) {
while (num !=0) {
//十进制表示 -->十六进制表示
System.out.println(Integer.toBinaryString(num));
int decIndex = n & lowBit;
// 疑问:获取的后四位吗?怎么变成整数类型,二进制呢?
//眼睛看到 就是从内存读取到寄存器数据。自动完成数据转换。
output.append(mapHex[decIndex]);
//n = n >>4; //死循环了。
//num >>>= 4;
System.out.println(Integer.toBinaryString(num));
}
//O4 bug -1 ;
//算术右移(>>):有符号的移位操,右移之后左侧的空位正数用0补充,负数用1补充
//11111111111111111111111111111111 死循环了。
//逻辑右移(>>>,无符号移位
return output.reverse().toString();
}
public static void main(String[] args)
{
Lc405 lc =new Lc405();
// System.out.println(lc.toHex(-5));
System.out.println(lc.toHex(-1));
//System.out.println(lc.toHex(26));
}
}
小思考:为什么java int 是有符号位 ,但是提供无符号移位>>>, 把有符号的当做无符号移动,这导致数据有问题,eg -1;
C语言没有提供,该怎办?
【之前理解全部补 0 是不对的,竟然还有补 1操作 】
-
原来存在的问题 右移运算符>>用来把操作数的各个二进制位全部右移若干位(大家都知道)
-
低位丢弃,高位补 0 或 1。
-
如果数据的最高位是 0,那么就补 0;
-
如果最高位是 1,那么就补 1。
-
-1 怎么右移动
(gdb) p/x -1>>4
$6 = 0xffffffff
(gdb) p/x -1>>11
$7 = 0xffffffff
(gdb) p/x -1>>31
$8 = 0xffffffff
2, 必须按照无符号移位方式移动。
(gdb) p/x (unsigned)-1>30 $14 = 0x1
go代码
func toHex(num int) string {
//01 check
if num == 0 {
return "0"
}
//02 d时间复杂度
result := make([]byte, 0)
// unsgined
if num < 0 {
num = math.MaxUint32 + num + 1
}
//03 空间复杂度
for num > 0 {
r := num & 0x000f
if r < 10 {
result = append([]byte{byte('0' + r)}, result...)
} else {
result = append([]byte{byte('a' + (r - 10))}, result...)
}
num = num >>4
}
return string(result)
}

作者介绍
公众号:offer多多
V1