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)。
进击的小🐴农