题目描述
原码、反码、补码都是一样的,都是正数本身。 对于负数: 原码是符号位为 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<cstdio>
#include<cstring>
#include<iomanip>
#include<iostream>
using namespace std;
#define ll long long
int main()
{
char ch;
ll n;
ll ff=0xffffffffffffffff,f=0x8000000000000000; //各位异或、符号位由正变负
while(cin>>ch>>n)
{
if(ch=='+')
{
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<n<<endl;
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<n<<endl;
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<n<<endl;
}
else
{
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<(n+f)<<endl;
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<(n^ff)<<endl;
cout<<"0x"<<setw(16)<<setfill('0')<<hex<<(n^ff)+1<<endl;
}
}
return 0;
}
PS:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
using namespace std;
int main()
{
long long int n=10000;
cout<<"十六进制"<<hex<<n<<endl;
cout<<"八进制"<<oct<<n<<endl;
cout<<"十进制"<<dec<<n<<endl;
cout << setw(10) << setiosflags(ios::left) <<setfill('*') << 10 << endl;
cout << setw(10) << setiosflags(ios::right) <<setfill('*') << 10 << endl;
cout << setw(10) << setfill('*') << 10 << endl;
return 0;
}
自行运行体会