今天和大家聊的问题叫做 数字转换为十六进制数,我们先来看题面:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/
Given an integer num, return a string representing its hexadecimal representation. For negative integers, two’s complement method is used.
All the letters in the answer string should be lowercase characters, and there should not be any leading zeros in the answer except for the zero itself.
Note: You are not allowed to use any built-in library method to directly solve this problem.
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。注意:十六进制中所有字母(a-f)都必须是小写。十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 给定的数确保在32位有符号整数范围内。不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例
示例 1: 输入: 26 输出: "1a" 示例 2: 输入: -1 输出: "ffffffff"
解题
主要思路:
整型自动保存为补码形式,因此只要将整型二进制的每四位取出,对应到相应的十六进制数就行。要注意的是,C++中左移是逻辑移动(从末端移掉的位将被舍弃,包括符号位)。右移是算术移位:对于无符号数字,因移位运算而空出的位上将用零填充。对于有符号数字,符号位用于填充空出的位。也就是说,如果数字为正,则使用 0;如果数字为负,则使用 1。所以当整型为负数时,右移永远不会变成0.
class Solution { public: string toHex(int num) { string s; char map[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; if(num==0) return "0"; while(num!=0&&s.size()<8) { s=map[num&0xf]+s; num>>=4; } return s; } };
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。