leetcode 405. Convert a Number to Hexadecimal

https://leetcode.com/problems/convert-a-number-to-hexadecimal/

题目描述

给出一个整型(int)的数,将其转换为十六进制的表示方法,负数要用二进制补码的形式表示

样例

Example 1:
Input:
26

Output:
"1a"
Example 2:
Input:
-1

Output:
"ffffffff"

解题思路分析

首先,如果这个数是个正数的话,那么非常简单,所以这题的关键就在于负数的情况。
这题我们可以通过两个思路进行开展。

1.负数的二进制补码表示

很多人都是知道负数在计算机内部的存储方式是补码的形式,也知道负数的补码就等于其反码+1。举个例子,如果我们使用的是4位的二进制,那么2的表示形式就是0010,2的反码表示形式就是1101,所以-2的表示形式就是其反码+1,是1110,转换成16进制也是同样的道理。所以我们这种思路的做法就是16进制表示形式,然后再对其进行取反,最后再+1得到我们的答案。

参考程序

class Solution {
public:
    string toHex(int num) {
        if(num == 0) return "0";
        int bit[10];
        memset(bit,0,sizeof(bit));
        int len = 0;
        long long n = num;
        n = abs(n);
        string ans = "";
        while(n)
        {
            bit[len++] = n % 16;
            n /= 16;
        }
        if(num < 0)
        {
            for(int i=0; i<8; i++)
            {
                bit[i] = 15 - bit[i];
            }
            int pos = 0;
            while(bit[pos] == 15)
            {
                bit[pos] = 0;
                pos++;
            }
            bit[pos]++;
        }
        int leader0 = 1;
        for(int i=7; i>=0; i--)
        {    
            if(bit[i] != 0) leader0 = 0;
            if(leader0 == 1) continue;
            if(bit[i] < 10) ans += (char)('0' + bit[i]);
            else ans += (char)('a' + bit[i] - 10);
        }
        return ans;
    }
};


2.计算机内部存储形式转换

一个整型的数,在计算机内部是怎么存储的呢?
很明显是已二进制的形式存储的,那么不管我们输入的是正数还是负数,其实计算机内部已经有了完整的存储,那么其实不需要我们自己再去计算反码补码,我们只需要对其进行2进制转换成16进制就可以了。

参考程序

class Solution {
public:
    string toHex(int num) {
        if(num == 0)
        {
            return "0";
        }
        int len = 0;
        string ans = "";
        while(num && len < 8)
        {
            int bit = num & 15;
            if(bit < 10) ans = (char)('0' + bit) + ans;
            else ans = (char)('a' + bit - 10) + ans;
            num >>= 4;
            len++;
        }
        return ans;
    }
};


要点突出(需要理解并掌握)

1.需要理解负数在计算机中的存储形式,以及掌握补码的转换方法。
2.了解计算机在存储数的机制

相关题目

E: https://leetcode.com/problems/single-number
M: https://leetcode.com/problems/maximum-product-of-word-lengths
H: https://leetcode.com/problems/minimum-unique-word-abbreviation
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值