数字转化为16进制数

忘是亡心i 2022-02-19 17:29 336阅读 0赞

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

思路1:

  1. 数组hash存储string hex=“0123456789abcdef”;
  2. 排除0
  3. 先考虑num大于0的数,实现非常简单
  4. 考虑num小于0的数,负数存储最高为1,且INT_MIN的绝对值等于INT_MAX+1,那么需要对INT_MIN做特殊处理;对其他负数存储用补码表示,那么INT_MAX+num+1即为数字该负数位上的值,最高位为1

    class Solution {
    public:

    1. string toHex(int num) {
    2. string HEX ="0123456789abcdef";
    3. if (num == 0) {
    4. return "0";
    5. }
    6. bool neg = false;
    7. if (num < 0) {
    8. num = INT_MAX + num +1;
    9. neg = true;
    10. }
    11. if (num == 0) {
    12. return "80000000";
    13. }
    14. string res;
    15. while (num > 0) {
    16. int k = num%16;
    17. num = num/16;
    18. if (num == 0 && neg) { // 负数最高为做处理
    19. k += 8;
    20. }
    21. res.insert(0, 1, HEX[k]);
    22. }
    23. return res;
    24. }

    };

其他思路:
1.不管num是正数还是负数,存储状态由计算机决定,负数以补码形式存储,排除存储形式干扰
2.16进制数,num数字以二进制方式存储,4位为一个16进制位,位移解决每个16进制数字
3.有符号数算数右移,正数右移超出值32次时,结果为0,负数超过则为-1,所以必须确定停止位移的条件!!!

  1. string toHex(int num) {
  2. if (num == 0) {
  3. return "0";
  4. }
  5. string hex = "0123456789abcdef";
  6. string res;
  7. while (num && res.size() < 8) { // num 不为0且res.size()小于8
  8. res = hex[num&0xf] + res;
  9. num >>= 4; // 负数算数右移超过int类型大小后,num结果为0xffffffff,即-1
  10. }
  11. return res;
  12. }

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读