405. 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:26Output:"1a"

Example 2:
Input:-1Output:"ffffffff"

翻译:将一个数字的位表示表示为十六进制,注意先导的零是要被去掉的。

典型的位操作,以四个位为单位进行操作取与。然后进行位右移循环。
要值得注意的是,右移分为算术右移和逻辑右移。算数右移是在右端补K个0,逻辑右移是在右端补K个最高位符号,一般语言的右移都是逻辑右移。对于正数来说,最高位是0,右移的结果最后总是零(因为最高位上是0),对于负数来说,右移的结果最后总是-1,(因为最高位上是1)。本来想用是否等于最后的结果(-1)来表示是否循环结束,但是这种想法是错误的。例如对于一个字节的数(1111 1110) 和(1101 1110)这两个数 前者左移四位就达到了-1,后者左移八位才到达,但是取出两者的位都需要两次操作。

其实,注意到负数最高位上是1,所以循环的次数一定是8,对于一个正数来说,其循环的次数由最高非零位来表示,于是可以由(num&mask)&&(num==0)来表示。

class Solution {
    public String toHex(int num) {
        StringBuilder sb = new StringBuilder();
        if(num==0)
            return "0";
        for(int i = 0 ;i<8;i++)
        {
            int mask = 0x0F;
            int val = num&mask;
            if(val==0&&num==0)
                break;
            char ch;
            if(val>=10)
                ch=(char)('a'+val-10);
            else
                ch=(char)('0'+val);
            sb.insert(0,ch);
            num>>=4;
        }
        return sb.toString();
        
    }
}

你可能感兴趣的:(405. Convert a Number to Hexadecimal)