题目描述:
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
注意:
十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
示例1:
输入:
26
输出:
“1a”
示例2:
输入:
-1
输出:
“ffffffff”
代码:
#include<sstream>
class Solution {
public:
//10转2 32位
string tentotwo(long long num){
string s = "";
while(num!=0){
int a=num%2;
string number;
stringstream ss;
ss<<a;
ss>>number;
s=s+number;
num=num/2;
}
int ll=s.length();
for(int i=0;i<(32-ll);i++)s=s+"0";
cout<<s<<endl;
reverse(s.begin(),s.end());
return s;
}
string tentohex(int num){
char numbers[6] = {'a','b','c','d','e','f'};
string s = "";
while(num!=0){
int a=num%16;
string number;
stringstream ss;
ss<<a;
ss>>number;
if(a>=10)s=s+numbers[a-10];
else s=s+number;
num=num/16;
}
reverse(s.begin(),s.end());
return s;
}
//2进制转16进制
string twotohex(string s){
string numbers[7] = {"a","b","c","d","e","f","f"};
int l=0,start=s.length()-1,end=s.length()-1;
string r="";
for(int i=s.length()-1;i>=0;i--){
l=l+1;
if(l==4){
start=i;
cout<<"start="<<start<<endl;
int sum=0,m=0;
for(int j=end;j>=start;j--){
cout<<"s[j]-'0'="<<s[j]-'0'<<endl;
sum=sum+(s[j]-'0')*pow(2,m);
m=m+1;
}
cout<<start<<" "<<end<<" "<<"sum:"<<sum<<endl;
int index = sum-10;
cout<<"index:"<<index<<endl;
if(index>=0)r=r+numbers[index];
else{
string number;
stringstream ss;
ss<<sum;
ss>>number;
r=r+number;
}
end=start-1;
l=0;
}
}
reverse(r.begin(),r.end());
return r;
}
//按位取反
string negate(string s){
string ss="";
for(int i=0;i<s.length();i++){
if(s[i]=='0')ss+="1";
else ss+="0";
}
return ss;
}
//2进制数加1
string twoaddone(string s){
int addflag=1;
for(int i=s.length()-1;i>=0;i--){
if(((s[i]-'0')+addflag)%2==0){
s[i]='0';
addflag=1;
}
else{
s[i]='1';
addflag=0;
return s;
}
}
return s;
}
//格式化
string format(string s){
string ss="";
for(int i=0;i<s.length();i++){
if(s[i]!='0'){
cout<<"good"<<endl;
ss=s.substr(i,s.length()-1-i+1);
break;
}
if(i==s.length()-1)ss=ss+s[i];
}
return ss;
}
string toHex(int num) {
if(num>0){
return tentohex(num);
}
else{
string s1=tentotwo((-1)*num);
cout<<"10转2进制结果:"<<s1<<endl;
string s2=negate(s1);
cout<<"取反结果:"<<s2<<endl;
string s3=twoaddone(s2);
cout<<"+1结果:"<<s3<<endl;
string s5=twotohex(s3);
cout<<"2转16进制数结果:"<<s5<<endl;
return format(s5);
}
}
};
求x的补码:
1.若x>0, 不变(要去多少进制就直接转为多少进制即可)
2.若x=0, 0
3.若x<0, 先x*(-1)变为正数,再二进制表示,然后各位取反,再加1,得到补码的二进制表示。若要求其他进制,则不要借助10进制,直接进行进制转换(因为有正负号,不能直接转为10进制)
注意特殊情况,-2147483648乘以-1后没法用int表示,超出范围,注意把tentotwo()函数的参数由int改为long long。