知识点提炼:
1.关于位运算?
分为逻辑位运算和算术位运算两种,区别在于是否考虑该数的符号。
向左位移n位,代表乘2^n;向右位移n位,代表除2^n.
左移运算符:
右移运算符:
2.push_back()的用法:
将元素添加到容器的末尾。string类也属于该方法的使用范围内。
PS:
pop_back() 移除最后一个元素
clear() 清除容器中所有元素
empty() 判断容器是否为空,返回一个bool型的值
erase() 删除指定元素
3.0xf
代表十六进制,通常与位运算结合使用
PS:对于nums & 0xf 或者 nums & 0b1111 或者 nums & 15 我暂时都统一理解为转换成相同进制,并完成模取余运算。
回到主题:(对于该题的求解)
方法一:
class Solution {
public:
string toHex(int num) {
if (num == 0) {
return "0";
}
string sb;
for (int i = 7; i >= 0; i --) {
int val = (num >> (4 * i)) & 0xf;
if (sb.length() > 0 || val > 0) {
char digit = val < 10 ? (char) ('0' + val) : (char) ('a' + val - 10);
sb.push_back(digit);
}
}
return sb;
}
};
方法二:(也是我采用的方法)
class Solution {
public:
string toHex(int num) {
//先考虑特殊情况,当这个十进制数为零时,十六进制数也为0
string s = "0123456789abcdef";
if (num == 0) {
return "0";
}
string result;
int count = 0;
while (num && count++ < 8) {
result = s[(num & 0xf)] + result;//这样就使新的字符拼接到原来的字符串的前面
num >>= 4;
}
return result;
}
};
此处对于方法二给予部分注释:
1.对于0-9,十进制和十六进制是相同的,但此处为了方便直接将0-f存入到字符串中,可以看做是一个字典。
2.开头考虑特殊情况,如果输入的是数字0,就直接返回字符0.
3.要是用java里的字符串数组来存储,最后还要将字符串反转,此处利用最基本的字符串拼接,将最新的字符拼接到已有的字符串前面,在存储的时候就完成了反转。
4.因为十六进制转化为2进制有32位,一般用四位二进制数表示一个位十六进制数。所以循环执行八次即可。
5.num & 0xf 这部分我还没有理解的很好,暂时就记下来,默认它为统一进制以及完成对15的取余。
6.num >> = 4 代表每次向右移动四位二进制数。对于考虑符号位的位运算来说,最高位补0或1.
PS:以上内容为本人学习所用,不定时更改!