我是靠谱客的博主 现实牛排,最近开发中收集的这篇文章主要介绍Leetcode 题解 - 数学-进制转换(2):16 进制[LeetCode] Convert a Number to Hexadecimal 数字转为十六进制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

[LeetCode] Convert a Number to Hexadecimal 数字转为十六进制

 

Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.

Note:

  1. All letters in hexadecimal (a-f) must be in lowercase.
  2. The hexadecimal string must not contain extra leading 0s. If the number is zero, it is represented by a single zero character '0'; otherwise, the first character in the hexadecimal string will not be the zero character.
  3. The given number is guaranteed to fit within the range of a 32-bit signed integer.
  4. You must not use any method provided by the library which converts/formats the number to hex directly.

 

Example 1:

Input:
26

Output:
"1a"

 

Example 2:

Input:
-1

Output:
"ffffffff"

2,题目思路 
如果仅仅是对十进制的数字转换为十六进制,其实还是不难的,关键在于对负数应该如何去处理。 
在这里面,负数是转化为补码的形式来进行运算的。 
在参考的算法后,得到了如下的实现思路: 
首先,定义一个字符串,用来获取相应十进制->十六进制的相关字符串。当然,也可以用字符相加减来获得,不过还需要将字符转换为字符串,有些繁琐。 
其次,如何将十进制转换为十六进制?用num和0xf进行&操作(11000&1111 = 1000->8),就可以得到num在二进制形式下,最后四位的值。这也是十进制转换十六进制的基本方法: 
十进制->二进制->十六进制 
得到了后四位的对应的值,再到定义的十六进制表中查找对应的十六进制的值,就可以得到目前最低位的HEX值。 
接下来看倒数第二个四位二进制值对应的十六进制值,实现办法就是将num>>4即可(二进制形式下右移四位)。 
负数也可以用这种办法来直接进行操作,因为计算机内部默认操作就是补码的形式。但是-1>>4仍然是-1,如果不做位数的判断,程序会陷入死循环,即……fffffff。而题目要求十六进制的数字最多就是8位,因此我们需要定义一个计数器,当位数为8时,自动跳出循环。
--------------------- 
作者:WhiteJunior 
来源:CSDN 
原文:https://blog.csdn.net/lym940928/article/details/79726374 

有无符号移动

计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负

1.有符号右移>>(若正数,高位补0,负数,高位补1)

正数:例如4>>2

首先写出4的二进制数,因为是正数所以最高位为0,也就是第一个

0000 0000 0000 0000 0000 0000 0000 0100

右移两位得到(高位补0)

000000 0000 0000 0000 0000 0000 0000 01

结果为:1,右移n位也就是4/(2^n)

负数:例如-4>>2(高位补1)

首先写出-4的二进制数,因为是负数所以最高位为1

1000 0000 0000 0000 0000 0000 0000 0100

然后写出-4补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)

1111 1111 1111 1111 1111 1111 1111 1100(补码)

右移2位: 在高位补1

1111 1111 1111 1111 1111 1111 1111 1111

根据补码写出原码才是我们所求的结果, 保留符号位,然后按位取反再加上1

100000 0000 0000 0000 0000 0000 0000 00(取反后的结果)

100000 0000 0000 0000 0000 0000 0000 01(再加1)

结果为:-1

 

2:无符号右移>>>(不论正负,高位均补0)

正数:例如4>>>2

与4>>2的运算相同,结果也为1

负数:例如-4>>>2

 

首先写出-4的二进制数,因为是负数所以最高位为1

1000 0000 0000 0000 0000 0000 0000 0100

然后写出-4补码:保证符号位不变,其余位置取反加1(从右往左遇到第一个1,然后剩下的全部取反就是了)

1111 1111 1111 1111 1111 1111 1111 1100(补码)

右移2位: 在高位补0

0011 1111 1111 1111 1111 1111 1111 1111

结果为:1073741823
--------------------- 

作者:Bush罗 
来源:CSDN 
原文:https://blog.csdn.net/bushqiang/article/details/79394211 

class Solution {
    public String toHex(int num) {
        char[] map = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    if (num == 0) return "0";
    StringBuilder sb = new StringBuilder();
    while (num != 0) {
        //这里固定是对补码操作,即便是负数会自动切换计算模式 不用担心
        sb.append(map[num & 0b1111]);  
        num >>>= 4; // 因为考虑的是补码形式,因此符号位就不能有特殊的意义,需要使用无符号右移,左边填 0
    }
    return sb.reverse().toString();    
    }
}

1101011010
百位     十位     个位
11       0101     1010

 

 

class Solution {
    public String toHex(int num) {
        char[] map = {'0', '1', '2', '3', '4', '5', '6', '7',
                     '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        if(num == 0)
            return "0";
        StringBuilder sb = new StringBuilder();
        while(num != 0){
            sb.append(map[num & 0b1111]);
            num >>>= 4;
        }
        return sb.reverse().toString();
    }
}


 

最后

以上就是现实牛排为你收集整理的Leetcode 题解 - 数学-进制转换(2):16 进制[LeetCode] Convert a Number to Hexadecimal 数字转为十六进制的全部内容,希望文章能够帮你解决Leetcode 题解 - 数学-进制转换(2):16 进制[LeetCode] Convert a Number to Hexadecimal 数字转为十六进制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部