405. 数字转换为十六进制数

问题描述:

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

解法1:

辗转相除法   (补码即原数加上2^32)

思路:辗转相除16 ,最后翻转,这是二进制转换的常规算法

代码:

public String toHex(int num) {
if(num==0) return "0";
long num_l = num;
StringBuilder sb = new StringBuilder();
if(num_l<0) num_l = (long)(Math.pow(2,32)+num_l);
while (num_l!=0){
long u =num_l%16;
char c = (char)(u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
num_l/=16;
}
return sb.reverse().toString();
}

解法2:分组加位运算  四位一位

思路: 将长度为 323232 的二进制转换为 161616 进制数,本质是对长度为 323232 的二进制数进行分组,每 444 个一组(二进制 (1111)2(1111)_2(1111)2​ 表示 151515,则使用长度为 444 的二进制可以表示 0-15)。
同时,由于我们是直接对长度为 323232 的二进制进行分组转算(444 个为一组,共 888 组),而长度为 323232 的二进制本身就是使用补码规则来表示的,因此我们无须额外处理「补码」问题。
具体的,我们将 numnumnum 与 151515 = (1111)2(1111)_2(1111)2​ 进行 & 运算,然后对 numnumnum 进行无符号右移 444 位来实现每 444 位处理。
题解链接:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/solution/gong-shui-san-xie-yi-ti-shuang-jie-jin-z-d93o/

代码实现:

public String toHex2(int num) {
if(num==0) return "0";
StringBuilder sb = new StringBuilder();
while (num!=0){
long u =num&15;
char c = (char)(u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
num>>>=4;
}
return sb.reverse().toString();
}

posted @ 2021-11-10 17:11  夜未央111  阅读(336)  评论(0)    收藏  举报