概述
[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:
- All letters in hexadecimal (
a-f
) must be in lowercase. - The hexadecimal string must not contain extra leading
0
s. 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. - The given number is guaranteed to fit within the range of a 32-bit signed integer.
- 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 数字转为十六进制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复