admin管理员组文章数量:1794759
有符号16进制计算器
用途:计算机里面的数据是用补码储存的,此代码适用于32位的16进制有符号数计算,如0x12345678+0x0 直接输入要运算的16进制有符号(0x等前缀,随便你带不带)。若要增加功能,自己修改主函数就行,代码思路,在最下面。
如图:
代码: #include<iostream> #include<string.h> #include<algorithm> #include<math.h> #define max_hex 8 using namespace std; long long int fun_16_10(string B) { string A=B; string::iterator it; for (it =A.begin(); it != A.end(); it++)//删除0 x X { if ( (*it != '0')&& (*it != 'x')&& (*it != 'X')){ break; } A.erase(it); it--;//删掉了一个所以要指针前移一位 } string binar2="" ; for(int i=0;i<A.length();i++)//转化为二进制(补码) { if(A[i]=='0') binar2+="0000"; else if(A[i]=='1') binar2+="0001"; else if(A[i]=='2') binar2+="0010"; else if(A[i]=='3') binar2+="0011"; else if(A[i]=='4') binar2+="0100"; else if(A[i]=='5') binar2+="0101"; else if(A[i]=='6') binar2+="0110"; else if(A[i]=='7') binar2+="0111"; else if(A[i]=='8') binar2+="1000"; else if(A[i]=='9') binar2+="1001"; else if(A[i]=='a'||A[i]=='A') binar2+="1010"; else if(A[i]=='b'||A[i]=='B') binar2+="1011"; else if(A[i]=='c'||A[i]=='C') binar2+="1100"; else if(A[i]=='d'||A[i]=='D') binar2+="1101"; else if(A[i]=='e'||A[i]=='E') binar2+="1110"; else if(A[i]=='f'||A[i]=='F') binar2+="1111"; else cout<<"输入错误"<<endl; } // cout<<"补码:"<<binar2<<endl; int len_bi2=binar2.length();//长度 long long int sum=0;//储存和 int x=0; if(A.length()==max_hex&&binar2[0]=='1') {//负数 for(int i=1;i<len_bi2;i++){ if(binar2[i]=='1') binar2[i]='0'; else binar2[i]='1'; } for(int i=len_bi2-1;i>0;i--) { sum+=(binar2[i]-'0')*pow(2,x); x++; } sum=-(sum+1);//之前差的1,补上 return sum; } x=0; sum=0; for(int i=len_bi2-1;i>=0;i--) { // cout<<"bin2:"<<binar2[i]<<endl; // cout<<"和:"<<(binar2[i]-'0')*pow(2,x)<<endl; sum+=(binar2[i]-'0')*pow(2,x); x++; } return sum; } int main() { // string A; // cout<<"请输入16进制数,最大8位,可带0x,可不带"<<endl; // while(cin>>A){ // cout<<"结果:"<<fun_16_10(A); // } string A,B; while(cin>>A>>B){ long long int a1,b1; a1=fun_16_10(A); b1=fun_16_10(B); cout<<"十进制A:"<<a1<<endl; cout<<"十进制A+B:"<<a1+b1<<endl; cout<<"十进制A-B:"<<"A-B=:"<<a1-b1<<endl; cout<<"十进制A*B:"<<"A*B=:"<<a1*b1<<endl; cout<<endl; //16进制输出 cout<<"十六进制A+B:"<<hex<<"A+B=:"<<a1+b1<<endl; cout<<"十六进制A-B:"<<hex<<"A-B=:"<<a1-b1<<endl; cout<<"十六进制A*B:"<<hex<<"A*B=:"<<a1*b1<<endl; cout<<endl; } } 如以下题目: 将两个16进制补码数相乘,然后保留结果低8位,使用普通的乘法器,都是当成无符号来计算的,与有符号的运算结果往往不同,如下: 正确答案应该如下:又如这一题: %eax-%edx,注意这里0x98f0d7b9 是负数,因为9=(1001) 2,符号位为1。
代码思路:1:数据获取——将输入的数,先去掉0x等前缀,然后变成二进制 2:数据从补码转换为原码——根据最高位(从右到左第32个二进制数)判断符号(补码最高位是符号位,1为负,0正) 接着转化为原码(正数不变。负数除了符号位,其它取反,最后+1) 3:再转化为十进制数(long long型) 4:十进制计算——正如普通四则运算 5:输出十六进制(cout<<hex<<xxx)
版权声明:本文标题:有符号16进制计算器 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686581617a84221.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论