[LC] 405. Convert a Number to Hexadecimal

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

嗯,就因为开头那一句负数参考补码,我研究了半天的补码。然后我发现...其实根本就不是那么回事。
如果这一题不允许负数的话,最直观的想法就是不停的模16然后除以16即可。然后看了看补码,想该怎么变换数字才能够继续这种无脑模16除16,发现这样做真的很复杂。所以换一种思维好了,16进制的表达法,其实就是2进制的表达法中,每四个1或0组成一组,然后将这一组二进制的四位数变成一个十六进制的一位数就好了,把它彻底变成一个位运算的题目,每次取其中最后四位变成一个十六进制数,然后整个数字右移四位,不停循环到数字为0即可。根据这个想法,就很快可以得到代码如下:

    public String toHex(int num) {
        if (num == 0) return "0";

        int mask = 15;
        StringBuilder resBuilder = new StringBuilder();
        for (int i = 0; i < 8 && num != 0; i++) {
            int value = mask & num;
            char ch;
            if (value < 10) {
                ch = (char)('0' + value);
            } else {
                ch = (char)('a' + (value - 10));
            }
            resBuilder.append(ch);
            num >>= 4;
        }
        
        resBuilder.reverse();
        return resBuilder.toString();
    }

其中mask = 15,其实也就是1111,所以每次mask & num其实就是取这个数字的最后四位。0是一个特别情况,你不能返回空字符串,所以就拿来特别处理就好。你也可以把mask换成0xf0000000,然后不停左移四位,这样就可以免掉reverse的那一步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值