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

 

题目:

 

 解答:

class Solution {
public:
    string toHex(int num) {
        if(num==0){
            return "0";
        }
        int x=num;
        string p="0123456789abcdef";
        string res="";
        while(res.size()<8 and x){
            res=p[x&0xf]+res;
            x>>=4;
        }
        return res;
    }
};

 

三个月没做过leetcode了 东西全忘了 从今天开始每天一道 入职字节以后也不能少 每天固定一道  难度不限

这题是考位运算的 都忘了 

1.先把整数转化为2进制 再从2进制每4位捏成一个16进制数。

2.但转化为二进制可能不是正好*4的,比如10进制的3就转化为2进制的11,那么还需要在前面补齐0/1(视正负号决定) 总之挺麻烦的

代码是高赞答案的 利用和1111(2进制,即16进制的f)作与运算就方便解决了上面的1。

然后是从低位到高位(即从右到左)进行与运算,这样即使最后剩下不到4个二进制位,做与运算时空位会被系统自动置0,和1与运算的结果还是0,

栗子:

假如10进制的33,2进制是:10001

那么先是后4位0001和1111(2进制)做与运算,得到0001,即16进制的1,res="1"

10001整个数字右移4位,丢弃掉已经考察的后4位,剩下1。1和1111做与运算,相当于0001和1111做与运算,得到1,加到res的前面,就得到11,这就是33的16进制表示了。

如果是负数,右移是补1(算术右移),1和1与运算还是1,所以没毛病,评论区有人说要用unisigned int,我觉得不用。

另外就是对于-1(ffffffff)这样除不尽的,当res达到8位就退出,因为int的16进制最长就是8位(int是32二进制位,一个16进制位等于4个二进制位,8*4=32)。

 

posted @ 2020-07-18 01:53  NeoZy  阅读(436)  评论(0编辑  收藏  举报