数字逻辑练习题
时间限制: 1 Sec 内存限制: 128 MB提交: 291 解决: 48
[ 提交][ 状态][ 讨论版]
题目描述
原码、反码、补码都是一样的,都是正数本身。
对于负数:
原码是符号位为 1,数值部分取绝对值的二进制。
反码是符号位为 1,其它位是原码取反。
补码是符号位为 1,其它位是原码取反,未位加 1。
输入一个 64bit 十进制整数,输出它的原码,反码,补码的 16 进制表示法
对于负数:
原码是符号位为 1,数值部分取绝对值的二进制。
反码是符号位为 1,其它位是原码取反。
补码是符号位为 1,其它位是原码取反,未位加 1。
输入一个 64bit 十进制整数,输出它的原码,反码,补码的 16 进制表示法
输入
有多组数据,每组数据一行,为一个 64bit 十进制整数,包含正负符号和数值,格式见样例。
输入保证有唯一原码,反码,补码对应。
输入保证有唯一原码,反码,补码对应。
输出
每组输出三个 16 进制数,分别为原码,反码,补码。
样例输入
+1
-1
+10086
-2333333
样例输出
0x0000000000000001
0x0000000000000001
0x0000000000000001
0x8000000000000001
0xfffffffffffffffe
0xffffffffffffffff
0x0000000000002766
0x0000000000002766
0x0000000000002766
0x8000000000239a95
0xffffffffffdc656a
0xffffffffffdc656b
注意正零负零
#include <iostream> #include <cstring> #include <string> #include <vector> #include <queue> #include <cstdio> #include <set> #include <math.h> #include <algorithm> #include <queue> #include <iomanip> #include <map> #include <bitset> #include <ctime> #define INF 0x3f3f3f3f #define MAXN 1005 #define Mod 1000000007 using namespace std; char f[20]= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//10进制对应的16进制 char ans[20]; int main() { #ifdef ONLINE_JUDGE #else freopen("G:/cbx/read.txt","r",stdin); //freopen("G:/cbx/out.txt","w",stdout); #endif long long n; char cn[MAXN]; while(cin>>cn) { bool z=true;//正数标志 bool fl=false;//负零标志 if(cn[0]=='-') z=false; if(cn[0]=='-'&&cn[1]=='0') fl=true; n=atoll(cn); if(z)//正数 { memset(ans,'\0',sizeof(ans)); int lans=0; //原码 string c=""; while(n)//转二进制 { c+=char((n%2)+'0'); n/=2; } int lenc=c.size(); string cc=""; int lencc=0; for(int i=lenc-1; i>=0; --i)//翻转 cc[lencc++]=c[i]; for(int i=0; i<lenc; ++i) c[i]=cc[i]; char ch[5]; int l=0,r=0; if(lenc<64)//不足64位前面补零 { cc=""; for(int i=0; i<64-lenc; ++i) cc+="0"; cc+=c; c=cc; } lenc=c.size(); for(int i=0; i<lenc; ++i) { if(i!=0&&(i+1)%4==0)//每次取4位处理 { r=i; memset(ch,'\0',sizeof(ch)); int cnt=0; for(int j=l; j<=r; ++j) ch[cnt++]=c[j]; ch[r+1]='\0'; int nn=strlen(ch); int w=1; int temp=0; while(nn--)//转成十进制 { temp+=(ch[nn]-'0')*w; w*=2; } ans[lans++]=f[temp];//对应的16进制 l=i+1; } } cout<<"0x"; for(int i=0; i<lans; ++i) { if(int(ans[i])<48) ans[i]+='0'; cout<<ans[i]; } cout<<endl; //反码 cout<<"0x"; for(int i=0; i<lans; ++i) { if(int(ans[i])<48) ans[i]+='0'; cout<<ans[i]; } cout<<endl; //补码 cout<<"0x"; for(int i=0; i<lans; ++i) { if(int(ans[i])<48) ans[i]+='0'; cout<<ans[i]; } cout<<endl; } else//负数 { char ans[20]; memset(ans,'\0',sizeof(ans)); int lans=0; //原码 n=abs(n); string c=""; while(n) { c+=char((n%2)+'0'); n/=2; } int lenc=c.size(); string cc=""; int lencc=0; for(int i=lenc-1; i>=0; --i) cc[lencc++]=c[i]; for(int i=0; i<lenc; ++i) c[i]=cc[i]; char ch[5]; int l=0,r=0; if(lenc<64) { string ccc=""; for(int i=0; i<64-lenc; ++i) ccc+="0"; ccc+=c; c=ccc; } lenc=c.size(); c[0]='1';//负数标志位置1 //cout<<c<<endl; l=0,r=0; cout<<"0x"; for(int i=0; i<lenc; ++i) { if(i!=0&&(i+1)%4==0) { r=i; memset(ch,'\0',sizeof(ch)); int cnt=0; for(int j=l; j<=r; ++j) ch[cnt++]=c[j]; ch[r+1]='\0'; int nn=4; int w=1; int temp=0; while(nn--) { temp+=(ch[nn]-'0')*w; w*=2; } cout<<f[temp]; l=i+1; } } cout<<endl; //反码 for(int i=1; i<lenc; ++i) { if(c[i]=='0') c[i]='1'; else if(c[i]=='1') c[i]='0'; } l=0,r=0; lans=0; lenc=c.size(); cout<<"0x"; for(int i=0; i<lenc; ++i) { if(i!=0&&(i+1)%4==0) { r=i; memset(ch,'\0',sizeof(ch)); int cnt=0; for(int j=l; j<=r; ++j) ch[cnt++]=c[j]; ch[r+1]='\0'; int nn=4; int w=1; int temp=0; while(nn--) { temp+=(ch[nn]-'0')*w; w*=2; } ans[lans++]=f[temp]; cout<<f[temp]; l=i+1; } } cout<<endl; //补码 if(fl) c[0]='0';//负零 for(int i=1; i<lenc; ++i) { if(c[i]=='0') c[i]='1'; else if(c[i]=='1') c[i]='0'; } int pos=-1; for(int i=63; i>0; --i) { if(c[i]=='1')//找到低位第1个1 { pos=i;//标记下标 break; } } if(pos!=-1)//从第1个1向高位各位取反 { for(int i=pos-1; i>0; --i) { if(c[i]=='0') c[i]='1'; else if(c[i]=='1') c[i]='0'; } } l=0,r=0; lans=0; lenc=c.size(); cout<<"0x"; for(int i=0; i<lenc; ++i) { if(i!=0&&(i+1)%4==0) { r=i; memset(ch,'\0',sizeof(ch)); int cnt=0; for(int j=l; j<=r; ++j) ch[cnt++]=c[j]; ch[r+1]='\0'; int nn=4; int w=1; int temp=0; while(nn--) { temp+=(ch[nn]-'0')*w; w*=2; } ans[lans++]=f[temp]; cout<<f[temp]; l=i+1; } } cout<<endl; } } return 0; }